
<!doctype html>
<html lang="en" class="no-js">
  <head>
    
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width,initial-scale=1">
      
      
      
      <link rel="icon" href="../../../../static/images/favicon.png">
      <meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.2.8">
    
    
      
        <title>mysql mgr faq CN - WL4G DOCS</title>
      
    
    
      <link rel="stylesheet" href="../../../../assets/stylesheets/main.644de097.min.css">
      
        
        <link rel="stylesheet" href="../../../../assets/stylesheets/palette.e6a45f82.min.css">
        
      
    
    
    
      
        
        
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
        <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
      
    
    
      <link rel="stylesheet" href="../../../../static/css/util.css">
    
    <script>__md_scope=new URL("../../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
    
      

    
    
  </head>
  
  
    
    
      
    
    
    
    
    <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="" data-md-color-accent="">
  
    
    
      <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
    
    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
    <label class="md-overlay" for="__drawer"></label>
    <div data-md-component="skip">
      
        
        <a href="#1-what-group-replication" class="md-skip">
          Skip to content
        </a>
      
    </div>
    <div data-md-component="announce">
      
    </div>
    
      <div data-md-component="outdated" hidden>
        <aside class="md-banner md-banner--warning">
          
        </aside>
      </div>
    
    
      

<header class="md-header" data-md-component="header">
  <nav class="md-header__inner md-grid" aria-label="Header">
    <a href="../../../.." title="WL4G DOCS" class="md-header__button md-logo" aria-label="WL4G DOCS" data-md-component="logo">
      
  <img src="../../../../static/images/mylogo.jpeg" alt="logo">

    </a>
    <label class="md-header__button md-icon" for="__drawer">
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
    </label>
    <div class="md-header__title" data-md-component="header-title">
      <div class="md-header__ellipsis">
        <div class="md-header__topic">
          <span class="md-ellipsis">
            WL4G DOCS
          </span>
        </div>
        <div class="md-header__topic" data-md-component="header-topic">
          <span class="md-ellipsis">
            
              mysql mgr faq CN
            
          </span>
        </div>
      </div>
    </div>
    
      <form class="md-header__option" data-md-component="palette">
        
          
          
          <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="" data-md-color-accent=""  aria-label="Switch to dark mode"  type="radio" name="__palette" id="__palette_1">
          
            <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6zm0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4zM7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg>
            </label>
          
        
          
          
          <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="" data-md-color-accent=""  aria-label="Switch to light mode"  type="radio" name="__palette" id="__palette_2">
          
            <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3z"/></svg>
            </label>
          
        
      </form>
    
    
      <div class="md-header__option">
        <div class="md-select">
          
          <button class="md-header__button md-icon" aria-label="Select language">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24z"/></svg>
          </button>
          <div class="md-select__inner">
            <ul class="md-select__list">
              
                <li class="md-select__item">
                  <a href="/en/" hreflang="en" class="md-select__link">
                    English
                  </a>
                </li>
                
                <li class="md-select__item">
                  <a href="/zh/" hreflang="zh" class="md-select__link">
                    简体中文
                  </a>
                </li>
                
            </ul>
          </div>
        </div>
      </div>
    
    
      <label class="md-header__button md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
      </label>
      <div class="md-search" data-md-component="search" role="dialog">
  <label class="md-search__overlay" for="__search"></label>
  <div class="md-search__inner" role="search">
    <form class="md-search__form" name="search">
      <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
      <label class="md-search__icon md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
      </label>
      <nav class="md-search__options" aria-label="Search">
        
        <button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
        </button>
      </nav>
      
        <div class="md-search__suggest" data-md-component="search-suggest"></div>
      
    </form>
    <div class="md-search__output">
      <div class="md-search__scrollwrap" data-md-scrollfix>
        <div class="md-search-result" data-md-component="search-result">
          <div class="md-search-result__meta">
            Initializing search
          </div>
          <ol class="md-search-result__list"></ol>
        </div>
      </div>
    </div>
  </div>
</div>
    
    
  </nav>
  
</header>
    
    <div class="md-container" data-md-component="container">
      
      
        
          
            
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
  <div class="md-tabs__inner md-grid">
    <ul class="md-tabs__list">
      
        
  
  


  
  
  
    <li class="md-tabs__item">
      <a href="../../../.." class="md-tabs__link">
        Getting Started
      </a>
    </li>
  

      
    </ul>
  </div>
</nav>
          
        
      
      <main class="md-main" data-md-component="main">
        <div class="md-main__inner md-grid">
          
            
              
              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    

  


  

<nav class="md-nav md-nav--primary md-nav--lifted md-nav--integrated" aria-label="Navigation" data-md-level="0">
  <label class="md-nav__title" for="__drawer">
    <a href="../../../.." title="WL4G DOCS" class="md-nav__button md-logo" aria-label="WL4G DOCS" data-md-component="logo">
      
  <img src="../../../../static/images/mylogo.jpeg" alt="logo">

    </a>
    WL4G DOCS
  </label>
  
  <ul class="md-nav__list" data-md-scrollfix>
    
      
      
      

  
  
  
    
    <li class="md-nav__item md-nav__item--nested">
      
      
        <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_1" data-md-state="indeterminate" type="checkbox" id="__nav_1" checked>
      
      
      
      
        <label class="md-nav__link" for="__nav_1">
          Getting Started
          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <nav class="md-nav" aria-label="Getting Started" data-md-level="1">
        <label class="md-nav__title" for="__nav_1">
          <span class="md-nav__icon md-icon"></span>
          Getting Started
        </label>
        <ul class="md-nav__list" data-md-scrollfix>
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../../.." class="md-nav__link">
        Introduction
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../../../ABOUT_CN/" class="md-nav__link">
        About
      </a>
    </li>
  

            
          
        </ul>
      </nav>
    </li>
  

    
  </ul>
</nav>
                  </div>
                </div>
              </div>
            
            
          
          <div class="md-content" data-md-component="content">
            <article class="md-content__inner md-typeset">
              
                


<p>感谢原创：苏家小萝卜 <a href="https://www.cnblogs.com/xinysu/p/6674832.html">细细探究MySQL Group Replicaiton --- 配置维护故障处理全集</a></p>
<hr />
<blockquote>
<p>本文主要描述 MySQL Group Replication的简易原理、搭建过程以及故障维护管理内容。由于是新技术，未在生产环境使用过，本文均是虚拟机测试，可能存在考虑不周跟思路有误情况，欢迎交流指正。</p>
</blockquote>
<hr />
<h3 id="1-what-group-replication"><a href="#What\ Group\ Replication">1 What Group Replication</a><a class="headerlink" href="#1-what-group-replication" title="Permanent link">&para;</a></h3>
<h3 id="2"><a href="#配置要求与限制">2 配置要求与限制</a><a class="headerlink" href="#2" title="Permanent link">&para;</a></h3>
<h4 id="21"><a href="#数据库要求">2.1 数据库要求</a><a class="headerlink" href="#21" title="Permanent link">&para;</a></h4>
<h5 id="211-innodb"><a href="#2.1.1\ innodb引擎">2.1.1 innodb引擎</a><a class="headerlink" href="#211-innodb" title="Permanent link">&para;</a></h5>
<h5 id="213"><a href="#2.1.3\ 隔离级别">2.1.3 隔离级别</a><a class="headerlink" href="#213" title="Permanent link">&para;</a></h5>
<h5 id="214"><a href="#2.1.4\ 外键">2.1.4 外键</a><a class="headerlink" href="#214" title="Permanent link">&para;</a></h5>
<h5 id="215-ipv4"><a href="#2.1.5\ IPv4网络，网络性能稳定延迟小带宽充足">2.1.5 IPv4网络，网络性能稳定延迟小带宽充足</a><a class="headerlink" href="#215-ipv4" title="Permanent link">&para;</a></h5>
<h5 id="216"><a href="#2.1.6\ 自增跟步长">2.1.6 自增跟步长</a><a class="headerlink" href="#216" title="Permanent link">&para;</a></h5>
<h4 id="22-mysql_replication"><a href="#2.2\ 安装mysql_replication引擎前提">2.2 安装mysql_replication引擎前提</a><a class="headerlink" href="#22-mysql_replication" title="Permanent link">&para;</a></h4>
<h4 id="23"><a href="#2.3\ 其他参数要求">2.3 其他参数要求</a><a class="headerlink" href="#23" title="Permanent link">&para;</a></h4>
<h3 id="3-mysql"><a href="#3\ 搭建Mysql\ Group\ Replication">3 搭建Mysql</a><a class="headerlink" href="#3-mysql" title="Permanent link">&para;</a></h3>
<h4 id="31-group_replication_single_primary_modeon"><a href="#3.1\ 单主模式（group_replication_single_primary_mode=ON）">3.1 单主模式（group_replication_single_primary_mode=ON）</a><a class="headerlink" href="#31-group_replication_single_primary_modeon" title="Permanent link">&para;</a></h4>
<h5 id="311"><a href="#3.1.1\ 主机名修改">3.1.1 主机名修改</a><a class="headerlink" href="#311" title="Permanent link">&para;</a></h5>
<h5 id="312"><a href="#3.1.2\ 设置环境变量">3.1.2 设置环境变量</a><a class="headerlink" href="#312" title="Permanent link">&para;</a></h5>
<h5 id="313"><a href="#3.1.3\ 建立复制账号">3.1.3 建立复制账号</a><a class="headerlink" href="#313" title="Permanent link">&para;</a></h5>
<h5 id="314"><a href="#3.1.4\ 安装引擎">3.1.4 安装引擎</a><a class="headerlink" href="#314" title="Permanent link">&para;</a></h5>
<h5 id="315-group"><a href="#3.1.5\ 配置Group">3.1.5 配置Group</a><a class="headerlink" href="#315-group" title="Permanent link">&para;</a></h5>
<h4 id="32-group_replication_single_primary_modeoff"><a href="#3.2\ 多主模式（group_replication_single_primary_mode=OFF）">3.2 多主模式（group_replication_single_primary_mode=OFF）</a><a class="headerlink" href="#32-group_replication_single_primary_modeoff" title="Permanent link">&para;</a></h4>
<h5 id="321-ip"><a href="#3.2.1\ 业务端连接IP处理">3.2.1 业务端连接IP处理</a><a class="headerlink" href="#321-ip" title="Permanent link">&para;</a></h5>
<h5 id="322-groupgroup"><a href="#3.2.2\ GROUP内成员逐个依次主动退出GROUP">3.2.2 GROUP内成员逐个依次主动退出GROUP</a><a class="headerlink" href="#322-groupgroup" title="Permanent link">&para;</a></h5>
<h5 id="323"><a href="#3.2.3\ group_replication_single_primary_mode参数关闭">3.2.3 关闭</a><a class="headerlink" href="#323" title="Permanent link">&para;</a></h5>
<h5 id="324-groupserver"><a href="#3.2.4\ 逐个启动GROUP内的SERVER">3.2.4 逐个启动GROUP内的SERVER</a><a class="headerlink" href="#324-groupserver" title="Permanent link">&para;</a></h5>
<h5 id="325-group"><a href="#3.2.5\ 检查现在GROUP情况">3.2.5 检查现在GROUP情况</a><a class="headerlink" href="#325-group" title="Permanent link">&para;</a></h5>
<h3 id="4"><a href="#4\ 管理维护">4 管理维护</a><a class="headerlink" href="#4" title="Permanent link">&para;</a></h3>
<h4 id="41-group"><a href="#4.1\ 查看GROUP中的成员有哪些">4.1 查看GROUP中的成员有哪些</a><a class="headerlink" href="#41-group" title="Permanent link">&para;</a></h4>
<h4 id="42"><a href="#4.2\ 单主模式下主库是哪个">4.2 单主模式下主库是哪个</a><a class="headerlink" href="#42" title="Permanent link">&para;</a></h4>
<h4 id="43"><a href="#4.3\ 检查数据库是否正常提供读写服务">4.3 检查数据库是否正常提供读写服务</a><a class="headerlink" href="#43" title="Permanent link">&para;</a></h4>
<h4 id="44"><a href="#4.4\ 检查数据库是否复制出现问题">4.4 检查数据库是否复制出现问题</a><a class="headerlink" href="#44" title="Permanent link">&para;</a></h4>
<h3 id="5"><a href="#5\ 故障模拟及处理">5 故障模拟及处理</a><a class="headerlink" href="#5" title="Permanent link">&para;</a></h3>
<h4 id="51"><a href="#5.1\ 单主模式">5.1 单主模式</a><a class="headerlink" href="#51" title="Permanent link">&para;</a></h4>
<h5 id="511-super_read_only"><a href="#5.1.1\ 主库宕机，如何自动选择新主库？各个实例之间的super_read_only模式如何切换？">5.1.1 主库宕机，如何自动选择新主库？各个实例之间的super_read_only模式如何切换？</a><a class="headerlink" href="#511-super_read_only" title="Permanent link">&para;</a></h5>
<h5 id="512-group"><a href="#5.1.2\ 主库宕机后，恢复，重新加入group">5.1.2 主库宕机后，恢复，重新加入group</a><a class="headerlink" href="#512-group" title="Permanent link">&para;</a></h5>
<h5 id="513-1"><a href="#5.1.3\ 从库宕机1台，影响情况">5.1.3 从库宕机1台，影响情况</a><a class="headerlink" href="#513-1" title="Permanent link">&para;</a></h5>
<h5 id="514-2"><a href="#5.1.4\ 从库宕机2台，影响情况">5.1.4 从库宕机2台，影响情况</a><a class="headerlink" href="#514-2" title="Permanent link">&para;</a></h5>
<h5 id="515-innobackupex"><a href="#5.1.5\ 新增从库：innobackupex新增（这个需要留意）">5.1.5 新增从库：innobackupex新增（这个需要留意）</a><a class="headerlink" href="#515-innobackupex" title="Permanent link">&para;</a></h5>
<h5 id="516-mysqldump"><a href="#5.1.6\ 新增从库：mysqldump新增（这个需要留意）">5.1.6 新增从库：mysqldump新增（这个需要留意）</a><a class="headerlink" href="#516-mysqldump" title="Permanent link">&para;</a></h5>
<h4 id="52"><a href="#5.2\ 多主模式">5.2 多主模式</a><a class="headerlink" href="#52" title="Permanent link">&para;</a></h4>
<h5 id="521"><a href="#5.2.1\ 单主模式切换多主模式">5.2.1 单主模式切换多主模式</a><a class="headerlink" href="#521" title="Permanent link">&para;</a></h5>
<h5 id="522"><a href="#5.2.2\ 宕机一台整体影响">5.2.2 宕机一台整体影响</a><a class="headerlink" href="#522" title="Permanent link">&para;</a></h5>
<h5 id="523"><a href="#5.2.3\ 宕机后重新加入">5.2.3 宕机后重新加入</a><a class="headerlink" href="#523" title="Permanent link">&para;</a></h5>
<h5 id="524"><a href="#5.2.4\ 宕机超过合理个数，整体影响（非一个个慢慢宕机，而是一口气宕机超过合理个数）">5.2.4 宕机超过合理个数，整体影响（非一个个慢慢宕机，而是一口气宕机超过合理个数）</a><a class="headerlink" href="#524" title="Permanent link">&para;</a></h5>
<h5 id="525-dbinnobackupex"><a href="#5.2.5\ 新增DB：innobackupex新增">5.2.5 新增DB：innobackupex新增</a><a class="headerlink" href="#525-dbinnobackupex" title="Permanent link">&para;</a></h5>
<h5 id="526-dbmysqldump"><a href="#5.2.6\ 新增DB：mysqldump新增">5.2.6 新增DB：mysqldump新增</a><a class="headerlink" href="#526-dbmysqldump" title="Permanent link">&para;</a></h5>
<h3 id="6"><a href="#6\ 问题记录">6 问题记录</a><a class="headerlink" href="#6" title="Permanent link">&para;</a></h3>
<h3 id="7"><a href="#7\ 未解决问题">7  未解决问题</a><a class="headerlink" href="#7" title="Permanent link">&para;</a></h3>
<hr />
<h2 id="1-what-group-replication_1">1 What Group Replication<a class="headerlink" href="#1-what-group-replication_1" title="Permanent link">&para;</a></h2>
<p>主从复制，一主多从，主库提供读写功能，从库提供写功能。当一个事务在master
提交成功时，会把binlog文件同步到从库服务器上落地为relay
log给slave端执行，这个过程主库是不考虑从库是否有接收到binlog文件，有可能出现这种情况，当主库commit一个事务后，数据库发生宕机，刚好它的binlog还没来得及传送到slave端，这个时候选任何一个slave端都会丢失这个事务，造成数据不一致情况。原理图如下：</p>
<p><img alt="" src="" /></p>
</div>
<div>

 

</div>

<div>

    
为了避免出现主从数据不一致的情况，MySQL引入了半同步复制，添加多了一个从库反馈机制，这个有两种方式设置：

</div>

<ul>
<li>主库执行完事务后，同步binlog给从库，从库ack反馈接收到binlog，<strong>主库提交commit</strong>，反馈给客户端，释放会话；</li>
<li>主库执行完事务后，<strong>主库提交commit</strong>
    ，同步binlog给从库，从库ack反馈接收到binlog，反馈给客户端，释放会话；</li>
</ul>
<p><img alt="" src="https://images2015.cnblogs.com/blog/608061/201704/608061-20170406221852332-1598182412.png" /></p>
<div>

   
[**但是，但是，但是，问题来了，虽然满足了一主多从，读写分析，数据一致，但是，依旧有两个弊端**]{style="color: rgba(255, 0, 0, 1)"}：

</div>

<ul>
<li>写操作集中在MASTER服务器上；</li>
<li>MASTER宕机后，需要人为选择新主并重新给其他的slave端执行change
    master（可自行写第三方工具实现，但是mysql的复制就是没提供，所以也算是弊端）</li>
</ul>
<div>

   
于是乎，官方感应到民间怨气以及业界压力，于2016年12月12日正式发布了MySQL
Group
Replication，此处应有掌声 ![]()

</div>

<div>

    那么，MySQL Group Replication可以提供哪些功能呢？

</div>

<ul>
<li>多主，在同一个group里边的所有实例，每一个实例可以执行写操作，也就是每个实例都执行Read-Write<ul>
<li>注意一点，多主情况下，当执行一个事务时，需要确保同个组内的每个实例都认可这个事务无冲突异常，才可以commit，如果设置的是单主，其他实例ReadOnly，则不需要进行上面的判断</li>
<li>多主情况下，事务并发冲突问题就凸显出来了，如何避免呢？数据库内部有一个认证程序，当不同实例并发对同一行发起修改，在同个组内广播认可时，会出现并发冲突，那么会按照先执行的提交，后执行的回滚</li>
</ul>
</li>
<li>弹性，同个Group
    Replication中，节点的加入或者移除都是自动调整；如果新加入一个节点，该节点会自动从Group的其他节点同步数据，直到与其他节点一致；如果移除一个节点，那么剩下的实例会自动更新，不再向这个节点广播事务操作，当然，这里要注意，假设一个Group的节点有n个（max(n)=9，同个Group最多节点数为9），移除或者宕机的节点数应该小于等于
    floor((n-1)/2)
    ，注意是向下取整；如果是单主模式，宕机的是单主，则人为选择新主后，其他节点也会自动从新主同步数据。</li>
<li>更高性能的同步机制</li>
</ul>
<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406221914175-665043210.png)

 

</div>

<div>

涉及知识点

</div>

<div>

故障探测（ Failure Detection）：

</div>

<div>

Group
Replication中有一个故障检测机制，会提供某些节点可能死掉的信息，然后广播给同一个Group的各个节点，如果确定宕机，那么组内的节点就会与它隔离开来，该节点即无法同步其他节点的传送过来的binlog
events，也无法执行任何本地事务。

</div>

<div>

**这里有个问题，故障探测中，假设N个节点，一个节点故障，是采用多数投票机制还是全部一致投票机制？**

</div>

<div>

 

</div>

<h1 id="2_1"><strong>2 配置要求与限制</strong><a class="headerlink" href="#2_1" title="Permanent link">&para;</a></h1>
<h2 id="21_1"><strong>2.1 数据库要求</strong><a class="headerlink" href="#21_1" title="Permanent link">&para;</a></h2>
<h3 id="211-innodb_1"><strong>2.1.1 innodb引擎</strong><a class="headerlink" href="#211-innodb_1" title="Permanent link">&para;</a></h3>
<div>

    为什么需要使用innodb引擎呢？在MySQL Group
Replication中，事务以乐观形式执行，但是在提交时检查冲突，如果存在冲突，则会在某些实例上回滚事务，保持各个实例的数据一致性，那么，这就需要使用到
事务存储引擎，同事Innodb提供一些额外的功能，可以更好的管理和处理冲突，所以建议 业务使用表格使用inndb存储引擎，类似于系统表格mysql.user使用MyISAM引擎的表格，因为极少修改及添加，极少出现冲突情况。

</div>

<div>

### ****2.1.**2 主键**

</div>

<div>

   
每个需要复制的表格都必须定义一个显式主键，注意跟隐式主键区分（使用Innodb引擎的表格，如果没有指定主键，默认选择第一个非空的唯一索引作为主键，如果没有，则自动创建一个6个字节的rowid隐式主键）。这个主键能在冲突发生时启动极其重要的作用，同时，能够有效提高relay
log的执行效率。

</div>

<h3 id="213_1"><strong><em>*2.1.</em>*3 隔离级别</strong><a class="headerlink" href="#213_1" title="Permanent link">&para;</a></h3>
<div>

    官网建议使用READ COMMITTED级别，除非应用程序依赖于REPLEATABLE
READ，RC模式下没有GAP
LOCK，比较好支持Innodb本身的冲突检测机制何组复制的内部分布式检测机制一起协同工作。不支持SERIALIZABLE隔离级别。

</div>

<h3 id="214_1"><strong><em>*2.1.</em>*4 外键</strong><a class="headerlink" href="#214_1" title="Permanent link">&para;</a></h3>
<div>

   
不建议使用级联外键，如果旧库本身有外键，业务上无法去除并且使用的是多主模式，那么，请配置 group_replication_enforce_update_everywhere_check
，强制检查每个组成员的级联检查，避免多主模式下执行级联操作造成的检测不到的冲突。

</div>

<h3 id="215-ipv4_1"><strong><em>*2.1.</em>*5 IPv4网络，网络性能稳定延迟小带宽充足</strong><a class="headerlink" href="#215-ipv4_1" title="Permanent link">&para;</a></h3>
<h3 id="216_1"><strong><em>*2.1.</em>*6 自增跟步长</strong><a class="headerlink" href="#216_1" title="Permanent link">&para;</a></h3>
<p>这里需要注意到，搭建group的时候，每个实例中的auto_increment_increment跟auto_increment_offset的配置情况。<strong>
</strong></p>
<ul>
<li>auto_increment_increment，在GROUP中范围在1-9（因为一个GROUP最多只能有9个组成员），GROUP中安装的时候，默认为7；</li>
<li>auto_increment_offset，增长步长，GROUP安装过程，是等于@@server_id的，但是注意有个规则是，[<strong>当
    auto_increment_offset &gt; auto_increment_increment的时候，则是忽略
    auto_increment_offset的设置，第一个insert的从1开始，组内其他成员的初始值按照插入顺序
    1+n*组员个数，若GROUP有3个成员，A,B,C，serverid分别为2243310，2243320，3423340，A先insert，C再insert，B最后insert，则初始值
    A是1，B是9，C是6 (测试结论，未找到实际说明文档)
    </strong>]{style="color: rgba(255, 0, 0, 1)"}</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1"></a><a href="#__codelineno-0-1"><span class="linenos" data-linenos="1 "></span></a>    1 mysql&gt; show global variables like &#39;auto_inc%&#39;;
<a id="__codelineno-0-2" name="__codelineno-0-2"></a><a href="#__codelineno-0-2"><span class="linenos" data-linenos="2 "></span></a>    2 +--------------------------+---------+
<a id="__codelineno-0-3" name="__codelineno-0-3"></a><a href="#__codelineno-0-3"><span class="linenos" data-linenos="3 "></span></a>    3 | Variable_name            | Value   |
<a id="__codelineno-0-4" name="__codelineno-0-4"></a><a href="#__codelineno-0-4"><span class="linenos" data-linenos="4 "></span></a>    4 +--------------------------+---------+
<a id="__codelineno-0-5" name="__codelineno-0-5"></a><a href="#__codelineno-0-5"><span class="linenos" data-linenos="5 "></span></a>    5 | auto_increment_increment | 7       |
<a id="__codelineno-0-6" name="__codelineno-0-6"></a><a href="#__codelineno-0-6"><span class="linenos" data-linenos="6 "></span></a>    6 | auto_increment_offset    | 2143340 |
<a id="__codelineno-0-7" name="__codelineno-0-7"></a><a href="#__codelineno-0-7"><span class="linenos" data-linenos="7 "></span></a>    7 +--------------------------+---------+
<a id="__codelineno-0-8" name="__codelineno-0-8"></a><a href="#__codelineno-0-8"><span class="linenos" data-linenos="8 "></span></a>    8 2 rows in set (0.00 sec)
</code></pre></div>
<h2 id="22-mysql_replication_1"><strong>2.2 安装mysql_replication引擎前提</strong><a class="headerlink" href="#22-mysql_replication_1" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>master info and relay log info repositories</strong><ul>
<li>master_info_repository<ul>
<li>set global master_info_repository ='table';</li>
</ul>
</li>
<li>relay_log_info_repository<ul>
<li>set global relay_log_info_repository='table';</li>
</ul>
</li>
<li>如果不设置会报错，报错信息如下<ul>
<li>[ERROR] For the creation of replication channels the
    master info and relay log info repositories must be set to
    TABLE</li>
</ul>
</li>
</ul>
</li>
<li><strong>binlog_checksum</strong><ul>
<li>binlog的校验方式应该设置为none</li>
<li>如果不设置，报错性能如下</li>
<li>[ERROR] Plugin group_replication reported: 'binlog_checksum
    should be NONE for Group Replication'</li>
</ul>
</li>
</ul>
<h2 id="23_1"><strong>2.3 其他参数要求</strong><a class="headerlink" href="#23_1" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>binary log设置</strong><ul>
<li>需要启动记录binary log，任何复制都需要使用到二进制内容</li>
<li>在配置文件中添加 log-bin = [binlog存储路径及命名方式]</li>
<li>例子： log-bin = /data/mysql/mysql3310/logs/bin_log</li>
</ul>
</li>
<li><strong>log-slave-updates设置</strong><ul>
<li>默认情况下，主库同步到从库执行的内容，是不产生binlog日志的，一般开启该参数是为了满足
    多级复制，比如
    A-&gt;B-&gt;C（A是B的主库，B是C的主库），那么这个时候B就需要开启这个参数记录从A同步到B上面的所有操作到binary
    log中，这样才能完整的同步到C上。</li>
<li>而在MGR中，组中的server需要记录从组接收和应用的所有事务，因为恢复的时候，是依赖域各个组的二进制日志内容的。</li>
<li>[<strong>那么这个时候，可能就有个疑问</strong>]{style="color: rgba(255, 0, 0, 1)"}，在多主模式下，假设实例A
    ,B , C三台中，每个实例修改的内容都记录到binary
    log中，再同步给其他组成员，那在B上执行事务 tranb :
    update了一行数据，tranb提交后同步到
    A跟C，各自执行后，由于启动了log-slave-updates设置，A跟C也生成了binary
    log，那么这些日志如果再同步回B，再执行一遍，不就可能出现问题了吗？实际上这个担忧是多余的，在MGR中，启动了GTID模式，会检查GTID
    EXCUTED集合，如果是已经执行的，则不会再次执行。</li>
</ul>
</li>
<li><strong>binary log格式</strong><ul>
<li>MGR依赖以及与行复制格式</li>
<li>binlog_format=row</li>
</ul>
</li>
<li><strong>GTID模式启动</strong><ul>
<li>组复制使用全局事务标识符来记录哪些事务已在所有server实例上提交，从而判断哪些是已提交事务哪些是冲突事务，避免重复执行及数据不一致</li>
<li>gtid_mode=ON</li>
</ul>
</li>
<li><strong>transaction_write_set_extraction</strong><ul>
<li>这个神奇的参数5.7.6版本引入，用于定义一个记录事务的算法，这个算法使用hash标识来记录事务。如果使用MGR，那么这个hash值需要用于分布式冲突检测何处理，在64位的系统，官网建议设置该参数使用 XXHASH64
    算法。</li>
<li>transaction_write_set_extraction ='XXHASH64'</li>
<li>官网解释：Defines the algorithm used to generate a hash
    identifying the writes associated with a transaction. If you are
    using Group Replication, the hash value is used for distributed
    conflict detection and handling. On 64-bit systems running Group
    Replication, we recommend setting this to XXHASH64 in order to
    avoid unnecessary hash collisions which result in certification
    failures and the roll back of user transactions</li>
</ul>
</li>
</ul>
<h1 id="3-mysql-group-replication"><strong>3 搭建Mysql Group Replication</strong><a class="headerlink" href="#3-mysql-group-replication" title="Permanent link">&para;</a></h1>
<div>

本次搭建采用3个实例，两个服务器，同一个网段，MGR的参数配置在配置文件中添加。

</div>

<ul>
<li>注意通讯端口号的配置，它用于组成员之间的通讯使用</li>
<li>请确定当前MySQL版本为5.7.17或者之后版本</li>
<li>每个实例的serverid必须是唯一标识，建议使用ip末端+端口描述</li>
</ul>
<div>

基础信息如下：

</div>

<div>

 

</div>

<p>+-----------------+-----------------+-----------------+-----------------+
| <code>{style="tex |            |            | C               |
| t-align: left"} |                 |                 |                 |
| 实例名          | A               | B               |                 |
|</code>             |                 |                 |                 |
|                 |           |           |                 |
+-----------------+-----------------+-----------------+-----------------+
|            |            |            |            |
|                 |                 |                 |                 |
| IP              | 192.168.9.242   | 192.168.9.242   | 192.168.9.244   |
|                 |                 |                 |                 |
|           |           |           |           |
+-----------------+-----------------+-----------------+-----------------+
|            |            |            |            |
|                 |                 |                 |                 |
| 实例端口号      | 3310            | 3320            | 3340            |
|                 |                 |                 |                 |
|           |           |           |           |
+-----------------+-----------------+-----------------+-----------------+
| Server-ID       |            |            |            |
|                 |                 |                 |                 |
|                 | 2423310         | 2423320         | 2443340         |
|                 |                 |                 |                 |
|                 |           |           |           |
+-----------------+-----------------+-----------------+-----------------+
|            |            |            |            |
|                 |                 |                 |                 |
| 通讯端口号      | 24201           | 24202           | 24404           |
|                 |                 |                 |                 |
|           |           |           |           |
+-----------------+-----------------+-----------------+-----------------+
|            |            |            |            |
|                 |                 |                 |                 |
| MySQL Versoin   | 5.7.17          | 5.7.17          | 5.7.17          |
|                 |                 |                 |                 |
|           |           |           |           |
+-----------------+-----------------+-----------------+-----------------+
|            |            |            |            |
|                 |                 |                 |                 |
| MGR参数配置方式 | 修改配置文件    | 修改配置文件    | 修改配置文件    |
|                 |                 |                 |                 |
|           |           |           |           |
+-----------------+-----------------+-----------------+-----------------+</p>
<div>

** **

</div>

<h2 id="31-group_replication_single_primary_mode-on"><strong>3.1 单主模式（group_replication_single_primary_mode</strong> =ON<strong>）</strong><a class="headerlink" href="#31-group_replication_single_primary_mode-on" title="Permanent link">&para;</a></h2>
<h3 id="311_1"><strong>3.1.1 主机名修改</strong><a class="headerlink" href="#311_1" title="Permanent link">&para;</a></h3>
<div>

   
为了方便后续管理维护以及一些不必要的错误，强烈建议修改主机名，尤其是当同个GROUP里边的SERVER主机名都是一样的情况下，由于本人在虚拟机中测试，虚拟机的主机名都是一样的，导致后续出现了部分问题，建议修改。

</div>

<div>

注意在两台SERVER上都修改哈！

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1"></a><a href="#__codelineno-1-1"><span class="linenos" data-linenos=" 1 "></span></a>     1 #查看当前主机名
<a id="__codelineno-1-2" name="__codelineno-1-2"></a><a href="#__codelineno-1-2"><span class="linenos" data-linenos=" 2 "></span></a>     2 hostname
<a id="__codelineno-1-3" name="__codelineno-1-3"></a><a href="#__codelineno-1-3"><span class="linenos" data-linenos=" 3 "></span></a>     3 
<a id="__codelineno-1-4" name="__codelineno-1-4"></a><a href="#__codelineno-1-4"><span class="linenos" data-linenos=" 4 "></span></a>     4 #修改主机名
<a id="__codelineno-1-5" name="__codelineno-1-5"></a><a href="#__codelineno-1-5"><span class="linenos" data-linenos=" 5 "></span></a>     5 hostname sutest242
<a id="__codelineno-1-6" name="__codelineno-1-6"></a><a href="#__codelineno-1-6"><span class="linenos" data-linenos=" 6 "></span></a>     6 
<a id="__codelineno-1-7" name="__codelineno-1-7"></a><a href="#__codelineno-1-7"><span class="linenos" data-linenos=" 7 "></span></a>     7 #进入vim /etc/hosts 
<a id="__codelineno-1-8" name="__codelineno-1-8"></a><a href="#__codelineno-1-8"><span class="linenos" data-linenos=" 8 "></span></a>     8 #添加记录，不要修改默认的 127.0.0.1跟::1的记录，其他的系统服务会使用到的
<a id="__codelineno-1-9" name="__codelineno-1-9"></a><a href="#__codelineno-1-9"><span class="linenos" data-linenos=" 9 "></span></a>     9 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
<a id="__codelineno-1-10" name="__codelineno-1-10"></a><a href="#__codelineno-1-10"><span class="linenos" data-linenos="10 "></span></a>    10 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
<a id="__codelineno-1-11" name="__codelineno-1-11"></a><a href="#__codelineno-1-11"><span class="linenos" data-linenos="11 "></span></a>    11 192.168.9.242 sutest242
<a id="__codelineno-1-12" name="__codelineno-1-12"></a><a href="#__codelineno-1-12"><span class="linenos" data-linenos="12 "></span></a>    12 192.168.9.244 sutest244
</code></pre></div>

</div>

<div>

配置后检查如下：

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406221959238-113862452.png)

</div>

<h3 id="312_1"><strong>3.1.2 设置环境变量</strong><a class="headerlink" href="#312_1" title="Permanent link">&para;</a></h3>
<div>

**关于GTID及日志信息记录相关参数（**这部分的参数设置含义可以查看
第二部分：配置要求与限制 **）**

</div>

<div>

<div>

gtid_mode=on

</div>

<div>

enforce-gtid-consistency=on

</div>

<div>

binlog_gtid_simple_recovery=1

</div>

<div>

log-slave-updates=1

</div>

<div>

binlog_checksum=NONE

</div>

<div>

master_info_repository=TABLE

</div>

<div>

relay_log_info_repository=TABLE

</div>

</div>

<div>

 

</div>

<div>

**关于MGR相关参数说明**

</div>

<div>

transaction_write_set_extraction #记录事务的算法

</div>

<div>

group_replication_start_on_boot #是否随服务器启动而自动启动组复制

</div>

<div>

group_replication_bootstrap_group
#引导组成员的组，这个用于第一次搭建MGR跟重新搭建MGR的时候使用

</div>

<div>

group_replication_group_name
 #此GROUP的名字，必须是一个有效的UUID，以此来区分整个内网里边的各个不的GROUP

</div>

<div>

group_replication_local_address #本地的IP地址字符串，host:port

</div>

<div>

group_replication_group_seeds
 #需要接受本实例的信息服务器IP地址字符串

</div>

<div>

**group_replication_single_primary_mode
#是否启动单主模式，如果启动，则本实例是主库，提供读写，其他实例仅提供读**

</div>

<div>

group_replication_enforce_update_everywhere_checks
#多主模式下，强制检查每一个实例是否允许该操作

</div>

<div>

 

</div>

<div>

**关于MGR相关参数配置**

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1"></a><a href="#__codelineno-2-1"><span class="linenos" data-linenos=" 1 "></span></a>     1 #动态配置：
<a id="__codelineno-2-2" name="__codelineno-2-2"></a><a href="#__codelineno-2-2"><span class="linenos" data-linenos=" 2 "></span></a>     2 set global transaction_write_set_extraction=&#39;XXHASH64&#39;;
<a id="__codelineno-2-3" name="__codelineno-2-3"></a><a href="#__codelineno-2-3"><span class="linenos" data-linenos=" 3 "></span></a>     3 set global group_replication_start_on_boot=OFF;
<a id="__codelineno-2-4" name="__codelineno-2-4"></a><a href="#__codelineno-2-4"><span class="linenos" data-linenos=" 4 "></span></a>     4 set global group_replication_bootstrap_group = OFF ;
<a id="__codelineno-2-5" name="__codelineno-2-5"></a><a href="#__codelineno-2-5"><span class="linenos" data-linenos=" 5 "></span></a>     5 set global group_replication_group_name= &#39;9ac06b4e-13aa-11e7-a62e-5254004347f9&#39;; #某个UUID
<a id="__codelineno-2-6" name="__codelineno-2-6"></a><a href="#__codelineno-2-6"><span class="linenos" data-linenos=" 6 "></span></a>     6 set global group_replication_local_address=&#39;192.168.9.242:24201&#39;;
<a id="__codelineno-2-7" name="__codelineno-2-7"></a><a href="#__codelineno-2-7"><span class="linenos" data-linenos=" 7 "></span></a>     7 set global group_replication_group_seeds =&#39;192.168.9.242:24201,192.168.9.242:24202,192.168.9.242:24401&#39;;
<a id="__codelineno-2-8" name="__codelineno-2-8"></a><a href="#__codelineno-2-8"><span class="linenos" data-linenos=" 8 "></span></a>     8 set global group_replication_ip_whitelist = &#39;127.0.0.1/8,192.168.9.0/24&#39;;
<a id="__codelineno-2-9" name="__codelineno-2-9"></a><a href="#__codelineno-2-9"><span class="linenos" data-linenos=" 9 "></span></a>     9 set global group_replication_single_primary_mode=True;
<a id="__codelineno-2-10" name="__codelineno-2-10"></a><a href="#__codelineno-2-10"><span class="linenos" data-linenos="10 "></span></a>    10 set global group_replication_enforce_update_everywhere_checks=False;
<a id="__codelineno-2-11" name="__codelineno-2-11"></a><a href="#__codelineno-2-11"><span class="linenos" data-linenos="11 "></span></a>    11  
<a id="__codelineno-2-12" name="__codelineno-2-12"></a><a href="#__codelineno-2-12"><span class="linenos" data-linenos="12 "></span></a>    12 #cnf文件配置：
<a id="__codelineno-2-13" name="__codelineno-2-13"></a><a href="#__codelineno-2-13"><span class="linenos" data-linenos="13 "></span></a>    13 server-id=12001
<a id="__codelineno-2-14" name="__codelineno-2-14"></a><a href="#__codelineno-2-14"><span class="linenos" data-linenos="14 "></span></a>    14 transaction_write_set_extraction = XXHASH64
<a id="__codelineno-2-15" name="__codelineno-2-15"></a><a href="#__codelineno-2-15"><span class="linenos" data-linenos="15 "></span></a>    15 loose-group_replication_group_name = &#39;9ac06b4e-13aa-11e7-a62e-5254004347f9&#39;
<a id="__codelineno-2-16" name="__codelineno-2-16"></a><a href="#__codelineno-2-16"><span class="linenos" data-linenos="16 "></span></a>    16 loose-group_replication_ip_whitelist = &#39;127.0.0.1/8,192.168.9.0/24&#39;
<a id="__codelineno-2-17" name="__codelineno-2-17"></a><a href="#__codelineno-2-17"><span class="linenos" data-linenos="17 "></span></a>    17 loose-group_replication_start_on_boot = OFF
<a id="__codelineno-2-18" name="__codelineno-2-18"></a><a href="#__codelineno-2-18"><span class="linenos" data-linenos="18 "></span></a>    18 loose-group_replication_local_address = &#39;192.168.9.242:24201&#39;
<a id="__codelineno-2-19" name="__codelineno-2-19"></a><a href="#__codelineno-2-19"><span class="linenos" data-linenos="19 "></span></a>    19 loose-group_replication_group_seeds = &#39;192.168.9.242:24201,192.168.9.242:24202,192.168.9.242:24401&#39;
<a id="__codelineno-2-20" name="__codelineno-2-20"></a><a href="#__codelineno-2-20"><span class="linenos" data-linenos="20 "></span></a>    20 loose-group_replication_bootstrap_group = OFF
<a id="__codelineno-2-21" name="__codelineno-2-21"></a><a href="#__codelineno-2-21"><span class="linenos" data-linenos="21 "></span></a>    21 loose-group_replication_single_primary_mode = true
<a id="__codelineno-2-22" name="__codelineno-2-22"></a><a href="#__codelineno-2-22"><span class="linenos" data-linenos="22 "></span></a>    22 loose-group_replication_enforce_update_everywhere_checks = false
</code></pre></div>

</div>

<div>

 

</div>

<div>

   
这一步这里采用配置文件添加的方式，**[添加成功后重启数据库服务]{style="color: rgba(255, 0, 0, 1)"}。**

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222058894-1643185754.png)

</div>

<h3 id="313_1"><strong>3.1.3 建立复制账号</strong><a class="headerlink" href="#313_1" title="Permanent link">&para;</a></h3>
<div>

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY
'replforslave';

</div>

<h3 id="314_1"><strong>3.1.4 安装引擎</strong><a class="headerlink" href="#314_1" title="Permanent link">&para;</a></h3>
<div>

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

</div>

<div>

 

</div>

<div>

如果出现1123错误，请查看当前的数据库版本是否是5.7.17及之后的版本，只有这些版本才有grou_replication插件

</div>

<div>

ERROR 1123 (HY000): Can't initialize function 'group_replication';
Plugin initialization function failed.

</div>

<div>

 

</div>

<div>

安装后，引擎默认会创建一个用户
_gr_user，提供group_replication引擎内部使用，其权限如下：

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222124910-1356680815.png)

</div>

<div>

检查是否安装成功，show plugins;

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222144566-371956849.png)

</div>

<div>

来到了这一步，离成功已经很近了，注意检查
步骤1-4，必须在每个实例或者server上都配置一遍。

</div>

<div>

 

</div>

<h3 id="315-group_1"><strong>3.1.5  配置Group</strong><a class="headerlink" href="#315-group_1" title="Permanent link">&para;</a></h3>
<div>

按照先把实例A加入Group中，由于是第一个加入Group中，需要启动group_replication_bootstrap_group，引导组，实例A加入成功后，陆续加入实例B及实例C。

</div>

<div>

 

</div>

<div>

首先，对实例A进行操作：

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1"></a><a href="#__codelineno-3-1"><span class="linenos" data-linenos=" 1 "></span></a>     1 #实例A
<a id="__codelineno-3-2" name="__codelineno-3-2"></a><a href="#__codelineno-3-2"><span class="linenos" data-linenos=" 2 "></span></a>     2 #1 查看当前的group replication相关参数是否配置有误
<a id="__codelineno-3-3" name="__codelineno-3-3"></a><a href="#__codelineno-3-3"><span class="linenos" data-linenos=" 3 "></span></a>     3 show global variables like &#39;group%&#39;;
<a id="__codelineno-3-4" name="__codelineno-3-4"></a><a href="#__codelineno-3-4"><span class="linenos" data-linenos=" 4 "></span></a>     4  
<a id="__codelineno-3-5" name="__codelineno-3-5"></a><a href="#__codelineno-3-5"><span class="linenos" data-linenos=" 5 "></span></a>     5 #2 启动 group_replication_bootstrap_group
<a id="__codelineno-3-6" name="__codelineno-3-6"></a><a href="#__codelineno-3-6"><span class="linenos" data-linenos=" 6 "></span></a>     6 SET GLOBAL group_replication_bootstrap_group=ON;
<a id="__codelineno-3-7" name="__codelineno-3-7"></a><a href="#__codelineno-3-7"><span class="linenos" data-linenos=" 7 "></span></a>     7  
<a id="__codelineno-3-8" name="__codelineno-3-8"></a><a href="#__codelineno-3-8"><span class="linenos" data-linenos=" 8 "></span></a>     8 #3 配置MGR
<a id="__codelineno-3-9" name="__codelineno-3-9"></a><a href="#__codelineno-3-9"><span class="linenos" data-linenos=" 9 "></span></a>     9 CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-3-10" name="__codelineno-3-10"></a><a href="#__codelineno-3-10"><span class="linenos" data-linenos="10 "></span></a>    10  
<a id="__codelineno-3-11" name="__codelineno-3-11"></a><a href="#__codelineno-3-11"><span class="linenos" data-linenos="11 "></span></a>    11 #4 启动MGR
<a id="__codelineno-3-12" name="__codelineno-3-12"></a><a href="#__codelineno-3-12"><span class="linenos" data-linenos="12 "></span></a>    12 start group_replication;
<a id="__codelineno-3-13" name="__codelineno-3-13"></a><a href="#__codelineno-3-13"><span class="linenos" data-linenos="13 "></span></a>    13  
<a id="__codelineno-3-14" name="__codelineno-3-14"></a><a href="#__codelineno-3-14"><span class="linenos" data-linenos="14 "></span></a>    14 #5 查看Error log，截图如下
<a id="__codelineno-3-15" name="__codelineno-3-15"></a><a href="#__codelineno-3-15"><span class="linenos" data-linenos="15 "></span></a>    15 #error log如果有问题，拉到本文末端，对应找错误，如果没有解决，请google或者留言
<a id="__codelineno-3-16" name="__codelineno-3-16"></a><a href="#__codelineno-3-16"><span class="linenos" data-linenos="16 "></span></a>    16  
<a id="__codelineno-3-17" name="__codelineno-3-17"></a><a href="#__codelineno-3-17"><span class="linenos" data-linenos="17 "></span></a>    17 #6 关闭 group_replication_bootstrap_group
<a id="__codelineno-3-18" name="__codelineno-3-18"></a><a href="#__codelineno-3-18"><span class="linenos" data-linenos="18 "></span></a>    18 SET GLOBAL group_replication_bootstrap_group=OFF;
</code></pre></div>

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222224238-2106717189.png) 

</div>

<div>

进入到数据目录，发现新建了几个文件：

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222236769-718782429.png) 

</div>

<div>

*_apaplier.*  系列文件 提供 SQL_Thread
使用，存储同个组内其他SERVER的binnary
log，这个文件在第一个组成员加入组的时候，可以在Error Log看到其安装信息。

</div>

<div>

[***_recovery.* 系列文件
是做什么使用的呢，在第一个成员启动MGR的时候，并没有看到其相关信息，稍后解疑！**]{style="color: rgba(255, 0, 0, 1)"}

</div>

<div>

先在实例A上开始造数据，建立数据库mgr，建立表格tb1，INSERT部分数据，操作如下：

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1"></a><a href="#__codelineno-4-1"><span class="linenos" data-linenos=" 1 "></span></a>![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif){#code_img_closed_ef890453-e53d-411e-b374-aadf0118af25
<a id="__codelineno-4-2" name="__codelineno-4-2"></a><a href="#__codelineno-4-2"><span class="linenos" data-linenos=" 2 "></span></a>.code_img_closed}![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif){#code_img_opened_ef890453-e53d-411e-b374-aadf0118af25
<a id="__codelineno-4-3" name="__codelineno-4-3"></a><a href="#__codelineno-4-3"><span class="linenos" data-linenos=" 3 "></span></a>.code_img_opened}
<a id="__codelineno-4-4" name="__codelineno-4-4"></a><a href="#__codelineno-4-4"><span class="linenos" data-linenos=" 4 "></span></a>
<a id="__codelineno-4-5" name="__codelineno-4-5"></a><a href="#__codelineno-4-5"><span class="linenos" data-linenos=" 5 "></span></a>``` {#cnblogs_code_open_ef890453-e53d-411e-b374-aadf0118af25 .cnblogs_code_hide}
<a id="__codelineno-4-6" name="__codelineno-4-6"></a><a href="#__codelineno-4-6"><span class="linenos" data-linenos=" 6 "></span></a>    #实例A
<a id="__codelineno-4-7" name="__codelineno-4-7"></a><a href="#__codelineno-4-7"><span class="linenos" data-linenos=" 7 "></span></a>    mysql&gt; create database mgr;
<a id="__codelineno-4-8" name="__codelineno-4-8"></a><a href="#__codelineno-4-8"><span class="linenos" data-linenos=" 8 "></span></a>    Query OK, 1 row affected (0.01 sec)
<a id="__codelineno-4-9" name="__codelineno-4-9"></a><a href="#__codelineno-4-9"><span class="linenos" data-linenos=" 9 "></span></a>
<a id="__codelineno-4-10" name="__codelineno-4-10"></a><a href="#__codelineno-4-10"><span class="linenos" data-linenos="10 "></span></a>    mysql&gt; use mgr
<a id="__codelineno-4-11" name="__codelineno-4-11"></a><a href="#__codelineno-4-11"><span class="linenos" data-linenos="11 "></span></a>    Database changed
<a id="__codelineno-4-12" name="__codelineno-4-12"></a><a href="#__codelineno-4-12"><span class="linenos" data-linenos="12 "></span></a>    mysql&gt; create table tb1(id int primary key auto_increment not null,name varchar(100));
<a id="__codelineno-4-13" name="__codelineno-4-13"></a><a href="#__codelineno-4-13"><span class="linenos" data-linenos="13 "></span></a>    Query OK, 0 rows affected (0.10 sec)
<a id="__codelineno-4-14" name="__codelineno-4-14"></a><a href="#__codelineno-4-14"><span class="linenos" data-linenos="14 "></span></a>
<a id="__codelineno-4-15" name="__codelineno-4-15"></a><a href="#__codelineno-4-15"><span class="linenos" data-linenos="15 "></span></a>    mysql&gt; insert into tb1(name) select @@server_id;
<a id="__codelineno-4-16" name="__codelineno-4-16"></a><a href="#__codelineno-4-16"><span class="linenos" data-linenos="16 "></span></a>    Query OK, 1 row affected (0.09 sec)
<a id="__codelineno-4-17" name="__codelineno-4-17"></a><a href="#__codelineno-4-17"><span class="linenos" data-linenos="17 "></span></a>    Records: 1  Duplicates: 0  Warnings: 0
<a id="__codelineno-4-18" name="__codelineno-4-18"></a><a href="#__codelineno-4-18"><span class="linenos" data-linenos="18 "></span></a>
<a id="__codelineno-4-19" name="__codelineno-4-19"></a><a href="#__codelineno-4-19"><span class="linenos" data-linenos="19 "></span></a>    mysql&gt; insert into tb1(name) select @@server_id;
<a id="__codelineno-4-20" name="__codelineno-4-20"></a><a href="#__codelineno-4-20"><span class="linenos" data-linenos="20 "></span></a>    Query OK, 1 row affected (0.00 sec)
<a id="__codelineno-4-21" name="__codelineno-4-21"></a><a href="#__codelineno-4-21"><span class="linenos" data-linenos="21 "></span></a>    Records: 1  Duplicates: 0  Warnings: 0
<a id="__codelineno-4-22" name="__codelineno-4-22"></a><a href="#__codelineno-4-22"><span class="linenos" data-linenos="22 "></span></a>
<a id="__codelineno-4-23" name="__codelineno-4-23"></a><a href="#__codelineno-4-23"><span class="linenos" data-linenos="23 "></span></a>    mysql&gt; insert into tb1(name) select @@server_id;
<a id="__codelineno-4-24" name="__codelineno-4-24"></a><a href="#__codelineno-4-24"><span class="linenos" data-linenos="24 "></span></a>    Query OK, 1 row affected (0.01 sec)
<a id="__codelineno-4-25" name="__codelineno-4-25"></a><a href="#__codelineno-4-25"><span class="linenos" data-linenos="25 "></span></a>    Records: 1  Duplicates: 0  Warnings: 0
<a id="__codelineno-4-26" name="__codelineno-4-26"></a><a href="#__codelineno-4-26"><span class="linenos" data-linenos="26 "></span></a>
<a id="__codelineno-4-27" name="__codelineno-4-27"></a><a href="#__codelineno-4-27"><span class="linenos" data-linenos="27 "></span></a>    mysql&gt; insert into tb1(name) select @@server_id;
<a id="__codelineno-4-28" name="__codelineno-4-28"></a><a href="#__codelineno-4-28"><span class="linenos" data-linenos="28 "></span></a>    Query OK, 1 row affected (0.00 sec)
<a id="__codelineno-4-29" name="__codelineno-4-29"></a><a href="#__codelineno-4-29"><span class="linenos" data-linenos="29 "></span></a>    Records: 1  Duplicates: 0  Warnings: 0
<a id="__codelineno-4-30" name="__codelineno-4-30"></a><a href="#__codelineno-4-30"><span class="linenos" data-linenos="30 "></span></a>
<a id="__codelineno-4-31" name="__codelineno-4-31"></a><a href="#__codelineno-4-31"><span class="linenos" data-linenos="31 "></span></a>    mysql&gt; select * from tb1;
<a id="__codelineno-4-32" name="__codelineno-4-32"></a><a href="#__codelineno-4-32"><span class="linenos" data-linenos="32 "></span></a>    +----+---------+
<a id="__codelineno-4-33" name="__codelineno-4-33"></a><a href="#__codelineno-4-33"><span class="linenos" data-linenos="33 "></span></a>    | id | name    |
<a id="__codelineno-4-34" name="__codelineno-4-34"></a><a href="#__codelineno-4-34"><span class="linenos" data-linenos="34 "></span></a>    +----+---------+
<a id="__codelineno-4-35" name="__codelineno-4-35"></a><a href="#__codelineno-4-35"><span class="linenos" data-linenos="35 "></span></a>    |  6 | 2423310 |
<a id="__codelineno-4-36" name="__codelineno-4-36"></a><a href="#__codelineno-4-36"><span class="linenos" data-linenos="36 "></span></a>    | 13 | 2423310 |
<a id="__codelineno-4-37" name="__codelineno-4-37"></a><a href="#__codelineno-4-37"><span class="linenos" data-linenos="37 "></span></a>    | 20 | 2423310 |
<a id="__codelineno-4-38" name="__codelineno-4-38"></a><a href="#__codelineno-4-38"><span class="linenos" data-linenos="38 "></span></a>    | 27 | 2423310 |
<a id="__codelineno-4-39" name="__codelineno-4-39"></a><a href="#__codelineno-4-39"><span class="linenos" data-linenos="39 "></span></a>    +----+---------+
<a id="__codelineno-4-40" name="__codelineno-4-40"></a><a href="#__codelineno-4-40"><span class="linenos" data-linenos="40 "></span></a>    4 rows in set (0.00 sec)
<a id="__codelineno-4-41" name="__codelineno-4-41"></a><a href="#__codelineno-4-41"><span class="linenos" data-linenos="41 "></span></a>
<a id="__codelineno-4-42" name="__codelineno-4-42"></a><a href="#__codelineno-4-42"><span class="linenos" data-linenos="42 "></span></a>    mysql&gt; show master status;
<a id="__codelineno-4-43" name="__codelineno-4-43"></a><a href="#__codelineno-4-43"><span class="linenos" data-linenos="43 "></span></a>    +----------------+----------+--------------+------------------+------------------------------------------+
<a id="__codelineno-4-44" name="__codelineno-4-44"></a><a href="#__codelineno-4-44"><span class="linenos" data-linenos="44 "></span></a>    | File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
<a id="__codelineno-4-45" name="__codelineno-4-45"></a><a href="#__codelineno-4-45"><span class="linenos" data-linenos="45 "></span></a>    +----------------+----------+--------------+------------------+------------------------------------------+
<a id="__codelineno-4-46" name="__codelineno-4-46"></a><a href="#__codelineno-4-46"><span class="linenos" data-linenos="46 "></span></a>    | bin_log.000002 |     1795 |              |                  | 9ac06b4e-13aa-11e7-a62e-5254004347f9:1-7 |
<a id="__codelineno-4-47" name="__codelineno-4-47"></a><a href="#__codelineno-4-47"><span class="linenos" data-linenos="47 "></span></a>    +----------------+----------+--------------+------------------+------------------------------------------+
<a id="__codelineno-4-48" name="__codelineno-4-48"></a><a href="#__codelineno-4-48"><span class="linenos" data-linenos="48 "></span></a>    1 row in set (0.00 sec)
</code></pre></div>

[模拟数据操作]{.cnblogs_code_collapse}
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1"></a><a href="#__codelineno-5-1"><span class="linenos" data-linenos=" 1 "></span></a>&lt;/div&gt;
<a id="__codelineno-5-2" name="__codelineno-5-2"></a><a href="#__codelineno-5-2"><span class="linenos" data-linenos=" 2 "></span></a>
<a id="__codelineno-5-3" name="__codelineno-5-3"></a><a href="#__codelineno-5-3"><span class="linenos" data-linenos=" 3 "></span></a>&lt;div&gt;
<a id="__codelineno-5-4" name="__codelineno-5-4"></a><a href="#__codelineno-5-4"><span class="linenos" data-linenos=" 4 "></span></a>
<a id="__codelineno-5-5" name="__codelineno-5-5"></a><a href="#__codelineno-5-5"><span class="linenos" data-linenos=" 5 "></span></a> 
<a id="__codelineno-5-6" name="__codelineno-5-6"></a><a href="#__codelineno-5-6"><span class="linenos" data-linenos=" 6 "></span></a>
<a id="__codelineno-5-7" name="__codelineno-5-7"></a><a href="#__codelineno-5-7"><span class="linenos" data-linenos=" 7 "></span></a>&lt;/div&gt;
<a id="__codelineno-5-8" name="__codelineno-5-8"></a><a href="#__codelineno-5-8"><span class="linenos" data-linenos=" 8 "></span></a>
<a id="__codelineno-5-9" name="__codelineno-5-9"></a><a href="#__codelineno-5-9"><span class="linenos" data-linenos=" 9 "></span></a>&lt;div&gt;
<a id="__codelineno-5-10" name="__codelineno-5-10"></a><a href="#__codelineno-5-10"><span class="linenos" data-linenos="10 "></span></a>
<a id="__codelineno-5-11" name="__codelineno-5-11"></a><a href="#__codelineno-5-11"><span class="linenos" data-linenos="11 "></span></a>接着，对实例B 进行操作：
<a id="__codelineno-5-12" name="__codelineno-5-12"></a><a href="#__codelineno-5-12"><span class="linenos" data-linenos="12 "></span></a>
<a id="__codelineno-5-13" name="__codelineno-5-13"></a><a href="#__codelineno-5-13"><span class="linenos" data-linenos="13 "></span></a>&lt;/div&gt;
<a id="__codelineno-5-14" name="__codelineno-5-14"></a><a href="#__codelineno-5-14"><span class="linenos" data-linenos="14 "></span></a>
<a id="__codelineno-5-15" name="__codelineno-5-15"></a><a href="#__codelineno-5-15"><span class="linenos" data-linenos="15 "></span></a>&lt;div&gt;
<a id="__codelineno-5-16" name="__codelineno-5-16"></a><a href="#__codelineno-5-16"><span class="linenos" data-linenos="16 "></span></a>
<a id="__codelineno-5-17" name="__codelineno-5-17"></a><a href="#__codelineno-5-17"><span class="linenos" data-linenos="17 "></span></a>``` {.cnblogs_code}
<a id="__codelineno-5-18" name="__codelineno-5-18"></a><a href="#__codelineno-5-18"><span class="linenos" data-linenos="18 "></span></a>     1 #实例B
<a id="__codelineno-5-19" name="__codelineno-5-19"></a><a href="#__codelineno-5-19"><span class="linenos" data-linenos="19 "></span></a>     2 #1 查看当前的group replication相关参数是否配置有误
<a id="__codelineno-5-20" name="__codelineno-5-20"></a><a href="#__codelineno-5-20"><span class="linenos" data-linenos="20 "></span></a>     3 show global variables like &#39;group%&#39;;
<a id="__codelineno-5-21" name="__codelineno-5-21"></a><a href="#__codelineno-5-21"><span class="linenos" data-linenos="21 "></span></a>     4  
<a id="__codelineno-5-22" name="__codelineno-5-22"></a><a href="#__codelineno-5-22"><span class="linenos" data-linenos="22 "></span></a>     5 #2 配置MGR
<a id="__codelineno-5-23" name="__codelineno-5-23"></a><a href="#__codelineno-5-23"><span class="linenos" data-linenos="23 "></span></a>     6 CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-5-24" name="__codelineno-5-24"></a><a href="#__codelineno-5-24"><span class="linenos" data-linenos="24 "></span></a>     7  
<a id="__codelineno-5-25" name="__codelineno-5-25"></a><a href="#__codelineno-5-25"><span class="linenos" data-linenos="25 "></span></a>     8 #3 启动MGR
<a id="__codelineno-5-26" name="__codelineno-5-26"></a><a href="#__codelineno-5-26"><span class="linenos" data-linenos="26 "></span></a>     9 start group_replication;
<a id="__codelineno-5-27" name="__codelineno-5-27"></a><a href="#__codelineno-5-27"><span class="linenos" data-linenos="27 "></span></a>    10  
<a id="__codelineno-5-28" name="__codelineno-5-28"></a><a href="#__codelineno-5-28"><span class="linenos" data-linenos="28 "></span></a>    11 #4 查看Error log，截图如下
<a id="__codelineno-5-29" name="__codelineno-5-29"></a><a href="#__codelineno-5-29"><span class="linenos" data-linenos="29 "></span></a>    12 #error log如果有问题，拉到本文末端，对应找错误，如果没有解决，请google或者留言
</code></pre></div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222305394-716137883.png)

</div>

<div>

   
通过errrlog，可以详细看到启动过程的所有步骤信息，由于新增数据，导致实例B需要使用到
group_replication_recovery
通道来恢复数据。但是是怎么一个恢复过程呢？查看 *_recovery.* 系列文件
都是只有文件头没有binlog内容的文件。

</div>

<div>

在加入实例C之前，再次在实例A上造数据，这次造多多数据。新建表格tb2，设置2个大字段，然后insert
2w+的数据量。

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1"></a><a href="#__codelineno-6-1"><span class="linenos" data-linenos=" 1 "></span></a>     1 #实例A
<a id="__codelineno-6-2" name="__codelineno-6-2"></a><a href="#__codelineno-6-2"><span class="linenos" data-linenos=" 2 "></span></a>     2 mysql&gt; use mgr
<a id="__codelineno-6-3" name="__codelineno-6-3"></a><a href="#__codelineno-6-3"><span class="linenos" data-linenos=" 3 "></span></a>     3 Database changed
<a id="__codelineno-6-4" name="__codelineno-6-4"></a><a href="#__codelineno-6-4"><span class="linenos" data-linenos=" 4 "></span></a>     4 mysql&gt; create table tb2(id int auto_increment primary key not null,namea varchar(8000),nameb varchar(8000));
<a id="__codelineno-6-5" name="__codelineno-6-5"></a><a href="#__codelineno-6-5"><span class="linenos" data-linenos=" 5 "></span></a>     5 Query OK, 0 rows affected (0.03 sec)
<a id="__codelineno-6-6" name="__codelineno-6-6"></a><a href="#__codelineno-6-6"><span class="linenos" data-linenos=" 6 "></span></a>     6 
<a id="__codelineno-6-7" name="__codelineno-6-7"></a><a href="#__codelineno-6-7"><span class="linenos" data-linenos=" 7 "></span></a>     7 mysql&gt; insert into tb2(namea,nameb) select repeat(&#39;a&#39;,8000),repeat(&#39;b&#39;,8000);
<a id="__codelineno-6-8" name="__codelineno-6-8"></a><a href="#__codelineno-6-8"><span class="linenos" data-linenos=" 8 "></span></a>     8 Query OK, 1 row affected (0.02 sec)
<a id="__codelineno-6-9" name="__codelineno-6-9"></a><a href="#__codelineno-6-9"><span class="linenos" data-linenos=" 9 "></span></a>     9 Records: 1  Duplicates: 0  Warnings: 0
<a id="__codelineno-6-10" name="__codelineno-6-10"></a><a href="#__codelineno-6-10"><span class="linenos" data-linenos="10 "></span></a>    10 
<a id="__codelineno-6-11" name="__codelineno-6-11"></a><a href="#__codelineno-6-11"><span class="linenos" data-linenos="11 "></span></a>    11 #insert 自行操作，看试验需要，本次需要大量数据来recovery，所以后面采用 insert into tb2 .. select .. from tb2 方式造数据 2w+行
</code></pre></div>

</div>

<div>

 

</div>

<div>

最后，对实例C 进行操作：

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1"></a><a href="#__codelineno-7-1"><span class="linenos" data-linenos=" 1 "></span></a>     1 #实例C
<a id="__codelineno-7-2" name="__codelineno-7-2"></a><a href="#__codelineno-7-2"><span class="linenos" data-linenos=" 2 "></span></a>     2 #1 查看当前的group replication相关参数是否配置有误
<a id="__codelineno-7-3" name="__codelineno-7-3"></a><a href="#__codelineno-7-3"><span class="linenos" data-linenos=" 3 "></span></a>     3 show global variables like &#39;group%&#39;;
<a id="__codelineno-7-4" name="__codelineno-7-4"></a><a href="#__codelineno-7-4"><span class="linenos" data-linenos=" 4 "></span></a>     4  
<a id="__codelineno-7-5" name="__codelineno-7-5"></a><a href="#__codelineno-7-5"><span class="linenos" data-linenos=" 5 "></span></a>     5 #2 配置MGR
<a id="__codelineno-7-6" name="__codelineno-7-6"></a><a href="#__codelineno-7-6"><span class="linenos" data-linenos=" 6 "></span></a>     6 CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-7-7" name="__codelineno-7-7"></a><a href="#__codelineno-7-7"><span class="linenos" data-linenos=" 7 "></span></a>     7  
<a id="__codelineno-7-8" name="__codelineno-7-8"></a><a href="#__codelineno-7-8"><span class="linenos" data-linenos=" 8 "></span></a>     8 #3 启动MGR
<a id="__codelineno-7-9" name="__codelineno-7-9"></a><a href="#__codelineno-7-9"><span class="linenos" data-linenos=" 9 "></span></a>     9 start group_replication;
<a id="__codelineno-7-10" name="__codelineno-7-10"></a><a href="#__codelineno-7-10"><span class="linenos" data-linenos="10 "></span></a>    10  
<a id="__codelineno-7-11" name="__codelineno-7-11"></a><a href="#__codelineno-7-11"><span class="linenos" data-linenos="11 "></span></a>    11 #4 查看Error log，截图如下
<a id="__codelineno-7-12" name="__codelineno-7-12"></a><a href="#__codelineno-7-12"><span class="linenos" data-linenos="12 "></span></a>    12 #error log如果有问题，拉到本文末端，对应找错误，如果没有解决，请google或者留言
</code></pre></div>

</div>

<div>

通过errrlog，可以详细看到启动过程的所有步骤信息，由于新增数据，导致实例C需要使用到
group_replication_recovery
通道来恢复数据，这跟实例B是一模一样的过程，但是，由于前期实例A造了大量的数据，所以在整个recovery的过程中，可以查看到  *_recovery.*
系列文件 的变化情况。

</div>

<div>

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222425269-1078424338.png)

</div>

<div>

    通过error log大小的变化，是通过group_replication_recovery
通道来恢复数据，需要恢复的binary log是存放在 ***_recovery.*
系列文件** ，通过本次recovery
文件查看，发现，在recovery过程中，通道内的IO_THREAD拉去日志存储在 *_recovery.*
系列文件 中，当通道内的 SQL_Thread
完成日志应用后，则会删除掉 *_recovery.* 系列文件
文件，新建空文件，代表已经没有数据需要恢复。

</div>

<div>

   
至此，单主模式已搭建结束，实例A可提供读写，但是实例B跟实例C仅提供读服务。

</div>

<div>

   
![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222519925-311857935.png)

[   
在搭建的过程中，也理清了两个重要通道的使用情况：]{style="line-height: 1.5"}

</div>

<ul>
<li>group_replication_applier 通道 提供组内成员向 MASTER
    实时同步binlog日志使用，这个通道内IO_thread拉取到的日志存放在 <em>_apaplier.</em>
    系列文件中，再通过SQL_Thread应用到组内的各个SERVER上。</li>
<li>group_replication_recovery 通道 提供
    首次加入GROUP或者重新加入GROUP时恢复数据使用，这个通道内
    IO_thread拉取到的日志存放在 <em>_recovery.</em>
    系列文件中，再通过SQL_Thread应用到组内的各个SERVER上，应用结束后，删除所有  <em>_recovery.</em>
    系列文件 ，重新建立新的 <em>_recovery.</em> 系列文件。</li>
</ul>
<div>

可以通过P_S库中的表格查询使用情况：SELECT * FROM
mysql.slave_relay_log_info

</div>

<div>

 

</div>

<h2 id="32-group_replication_single_primary_mode-off"><strong>3.2 多主模式（group_replication_single_primary_mode</strong> =OFF<strong>）</strong><a class="headerlink" href="#32-group_replication_single_primary_mode-off" title="Permanent link">&para;</a></h2>
<div>

    多主模式如何配置呢，其实跟 单主模式的流程一模一样，只需要修改 3.1
单主模式 中第二部
配置环境变量中，把 group_replication_single_primary_mode
参数设置成关闭状态即可，然后按照 单足模式的一直执行就可以了。

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1"></a><a href="#__codelineno-8-1"><span class="linenos" data-linenos="1 "></span></a>    # 动态修复方式
<a id="__codelineno-8-2" name="__codelineno-8-2"></a><a href="#__codelineno-8-2"><span class="linenos" data-linenos="2 "></span></a>    set global group_replication_single_primary_mode=OFF;
<a id="__codelineno-8-3" name="__codelineno-8-3"></a><a href="#__codelineno-8-3"><span class="linenos" data-linenos="3 "></span></a>
<a id="__codelineno-8-4" name="__codelineno-8-4"></a><a href="#__codelineno-8-4"><span class="linenos" data-linenos="4 "></span></a>    # 配置文件修改方式
<a id="__codelineno-8-5" name="__codelineno-8-5"></a><a href="#__codelineno-8-5"><span class="linenos" data-linenos="5 "></span></a>    loose-group_replication_single_primary_mode = OFF
</code></pre></div>

</div>

<div>

 

</div>

<div>

   
但是，既然说到配置多主模式，除了从头就直接配置多主外，还有一种情况是，本来是单主模式，现在修改为多主模式，这个转换过程，则是这部分要来描述的。

</div>

<div>

   
首先，考虑到的是，能否直接在多主模式运行的情况下，就直接动态修改这个参数呢？因为这个参数是可以动态调整，BUT，在
GROUP_REPLICATION 运行的过程中，是不能修改这个参数的，会友好的提示您：

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222554785-1757014790.png)

</div>

<div>

 

</div>

<div>

    所以，需要新停掉GROUP_REPLICATION。

</div>

<div>

 

</div>

<div>

    操作流程：业务端连接IP处理 -> GROUP内成员逐个依次主动退出GROUP ->
关闭 group_replication_single_primary_mode参数->
逐个启动GROUP内的SERVER

</div>

<h3 id="321-ip_1"><strong>3.2.1 业务端连接IP处理</strong><a class="headerlink" href="#321-ip_1" title="Permanent link">&para;</a></h3>
<div>

   
对程序端端影响：如果是程序直连主库，则不需要操心这个过程，但是如果是通过第三方工具检查GROUP中的主库是哪个的话，需要先修改第三方工具直连原主库，因为所有Group内的成员都要停止服务，如果都是自动判断的话，最后会找不到GROUP中的成员的，所以，在开始切换的时候，就需要业务方固定读写在实例A上。

</div>

<h3 id="322-groupgroup_1"><strong>3.2.2 GROUP内成员逐个依次主动退出GROUP</strong><a class="headerlink" href="#322-groupgroup_1" title="Permanent link">&para;</a></h3>
<div>

连接实例A：

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1"></a><a href="#__codelineno-9-1"><span class="linenos" data-linenos="1 "></span></a>    1 #实例A
<a id="__codelineno-9-2" name="__codelineno-9-2"></a><a href="#__codelineno-9-2"><span class="linenos" data-linenos="2 "></span></a>    2 stop group_replication;
<a id="__codelineno-9-3" name="__codelineno-9-3"></a><a href="#__codelineno-9-3"><span class="linenos" data-linenos="3 "></span></a>    3  
<a id="__codelineno-9-4" name="__codelineno-9-4"></a><a href="#__codelineno-9-4"><span class="linenos" data-linenos="4 "></span></a>    4 #检查实例B，C的error log，发现实例A主动退出，group成员删除实例A
</code></pre></div>

</div>

<div>

Error Log内容如下：

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222641457-915042670.png)

</div>

<div>

   
这个时候，A可读写，但是不在group中，其binlog内容不会在组内同步；C升级自动升级为主库，可读写，binlog会同步到B上。**这里的主库升级，是看MEMBER_ID的升序排序情况，最小的升级为主库**。

</div>

<div>

在B上通过表格
replication_group_members跟global_status，可以查看现在的组成员以及主库是哪个。查看截图如下： 

</div>

<div>

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222706300-2057722926.png)

</div>

<div>

 

</div>

<div>

连接实例B：

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1"></a><a href="#__codelineno-10-1"><span class="linenos" data-linenos="1 "></span></a>    1 #实例B
<a id="__codelineno-10-2" name="__codelineno-10-2"></a><a href="#__codelineno-10-2"><span class="linenos" data-linenos="2 "></span></a>    2 stop group_replication;
<a id="__codelineno-10-3" name="__codelineno-10-3"></a><a href="#__codelineno-10-3"><span class="linenos" data-linenos="3 "></span></a>    3  
<a id="__codelineno-10-4" name="__codelineno-10-4"></a><a href="#__codelineno-10-4"><span class="linenos" data-linenos="4 "></span></a>    4 #检查实例B，C的error log，发现实例A主动退出，group成员删除实例A
</code></pre></div>

</div>

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222736519-1529722499.png)

</div>

<div>

   
这个时候，A，B均可以读写，但是不在GROUP中，业务目前在A上运行，C也可以读写，目前是主库。

</div>

<div>

 

</div>

<div>

连接实例C：

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1"></a><a href="#__codelineno-11-1"><span class="linenos" data-linenos="1 "></span></a>    #实例c
<a id="__codelineno-11-2" name="__codelineno-11-2"></a><a href="#__codelineno-11-2"><span class="linenos" data-linenos="2 "></span></a>    stop group_replication;
</code></pre></div>

</div>

<div>

**![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222822316-1426041478.png)**

</div>

<div>

   

</div>

<div>

    这个时候，整个GROUP内的所有成员都依次自动退出了GROUP。

</div>

<h3 id="323-group_replication_single_primary_mode"><strong>3.2.3 关闭 group_replication_single_primary_mode参数</strong><a class="headerlink" href="#323-group_replication_single_primary_mode" title="Permanent link">&para;</a></h3>
<div>

   
需要修改2个地方，第一个是动态修改参数，第二个是到配置文件中修改参数（防止DB服务重启，参数失效）！

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1"></a><a href="#__codelineno-12-1"><span class="linenos" data-linenos=" 1 "></span></a>    #动态修改
<a id="__codelineno-12-2" name="__codelineno-12-2"></a><a href="#__codelineno-12-2"><span class="linenos" data-linenos=" 2 "></span></a>    #实例A
<a id="__codelineno-12-3" name="__codelineno-12-3"></a><a href="#__codelineno-12-3"><span class="linenos" data-linenos=" 3 "></span></a>    set global group_replication_single_primary_mode =OFF
<a id="__codelineno-12-4" name="__codelineno-12-4"></a><a href="#__codelineno-12-4"><span class="linenos" data-linenos=" 4 "></span></a>
<a id="__codelineno-12-5" name="__codelineno-12-5"></a><a href="#__codelineno-12-5"><span class="linenos" data-linenos=" 5 "></span></a>    #实例B
<a id="__codelineno-12-6" name="__codelineno-12-6"></a><a href="#__codelineno-12-6"><span class="linenos" data-linenos=" 6 "></span></a>    set global group_replication_single_primary_mode =OFF
<a id="__codelineno-12-7" name="__codelineno-12-7"></a><a href="#__codelineno-12-7"><span class="linenos" data-linenos=" 7 "></span></a>
<a id="__codelineno-12-8" name="__codelineno-12-8"></a><a href="#__codelineno-12-8"><span class="linenos" data-linenos=" 8 "></span></a>    #实例C
<a id="__codelineno-12-9" name="__codelineno-12-9"></a><a href="#__codelineno-12-9"><span class="linenos" data-linenos=" 9 "></span></a>    set global group_replication_single_primary_mode =OFF
<a id="__codelineno-12-10" name="__codelineno-12-10"></a><a href="#__codelineno-12-10"><span class="linenos" data-linenos="10 "></span></a>
<a id="__codelineno-12-11" name="__codelineno-12-11"></a><a href="#__codelineno-12-11"><span class="linenos" data-linenos="11 "></span></a>
<a id="__codelineno-12-12" name="__codelineno-12-12"></a><a href="#__codelineno-12-12"><span class="linenos" data-linenos="12 "></span></a>    #配置文件添加
<a id="__codelineno-12-13" name="__codelineno-12-13"></a><a href="#__codelineno-12-13"><span class="linenos" data-linenos="13 "></span></a>    #实例A的cnf文件中修改
<a id="__codelineno-12-14" name="__codelineno-12-14"></a><a href="#__codelineno-12-14"><span class="linenos" data-linenos="14 "></span></a>    loose-group_replication_single_primary_mode = OFF
<a id="__codelineno-12-15" name="__codelineno-12-15"></a><a href="#__codelineno-12-15"><span class="linenos" data-linenos="15 "></span></a>
<a id="__codelineno-12-16" name="__codelineno-12-16"></a><a href="#__codelineno-12-16"><span class="linenos" data-linenos="16 "></span></a>    #实例B的cnf文件中修改
<a id="__codelineno-12-17" name="__codelineno-12-17"></a><a href="#__codelineno-12-17"><span class="linenos" data-linenos="17 "></span></a>    loose-group_replication_single_primary_mode = OFF
<a id="__codelineno-12-18" name="__codelineno-12-18"></a><a href="#__codelineno-12-18"><span class="linenos" data-linenos="18 "></span></a>
<a id="__codelineno-12-19" name="__codelineno-12-19"></a><a href="#__codelineno-12-19"><span class="linenos" data-linenos="19 "></span></a>    #实例C的cnf文件中修改
<a id="__codelineno-12-20" name="__codelineno-12-20"></a><a href="#__codelineno-12-20"><span class="linenos" data-linenos="20 "></span></a>    loose-group_replication_single_primary_mode = OFF
</code></pre></div>

</div>

<div>

 

</div>

<div>

为了模拟有业务在实例A上操作，在实例A上创建表格 tb4，并导入tb2的所有数据

</div>

<div>

 

<div class="highlight"><pre><span></span><code><a id="__codelineno-13-1" name="__codelineno-13-1"></a><a href="#__codelineno-13-1"><span class="linenos" data-linenos="1 "></span></a>    #实例A
<a id="__codelineno-13-2" name="__codelineno-13-2"></a><a href="#__codelineno-13-2"><span class="linenos" data-linenos="2 "></span></a>    mysql&gt; create table tb4 like tb2;
<a id="__codelineno-13-3" name="__codelineno-13-3"></a><a href="#__codelineno-13-3"><span class="linenos" data-linenos="3 "></span></a>    Query OK, 0 rows affected (0.18 sec)
<a id="__codelineno-13-4" name="__codelineno-13-4"></a><a href="#__codelineno-13-4"><span class="linenos" data-linenos="4 "></span></a>
<a id="__codelineno-13-5" name="__codelineno-13-5"></a><a href="#__codelineno-13-5"><span class="linenos" data-linenos="5 "></span></a>    mysql&gt; insert into tb4 select * from tb2;
<a id="__codelineno-13-6" name="__codelineno-13-6"></a><a href="#__codelineno-13-6"><span class="linenos" data-linenos="6 "></span></a>    Query OK, 20480 rows affected (33.13 sec)
<a id="__codelineno-13-7" name="__codelineno-13-7"></a><a href="#__codelineno-13-7"><span class="linenos" data-linenos="7 "></span></a>    Records: 20480  Duplicates: 0  Warnings: 0
</code></pre></div>

</div>

<h3 id="324-groupserver_1"><strong>3.2.4 逐个启动GROUP内的SERVER</strong><a class="headerlink" href="#324-groupserver_1" title="Permanent link">&para;</a></h3>
<div>

   
首先针对实例A启动，然后启动实例B，紧接着启动实例C。这个过程中，每加入一个组成员，记得去看error
log是否有报错。

</div>

<div>

当A启动的时候，可以看到成了一个新的GROUP，B加入到时候，需要通过 group_replication_recovery
通道恢复数据，C加入到时候，也需要通过 group_replication_recovery
通道恢复数据，这部分的内容跟 3.1. 5 配置Group
中的errorlog内容差不多，这里就不做截图分析。

</div>

<div>

 

<div class="highlight"><pre><span></span><code><a id="__codelineno-14-1" name="__codelineno-14-1"></a><a href="#__codelineno-14-1"><span class="linenos" data-linenos=" 1 "></span></a>    #实例A
<a id="__codelineno-14-2" name="__codelineno-14-2"></a><a href="#__codelineno-14-2"><span class="linenos" data-linenos=" 2 "></span></a>    #需要启动 group_replication_bootstrap_group 引导组，启动后需要关闭，防止脑裂
<a id="__codelineno-14-3" name="__codelineno-14-3"></a><a href="#__codelineno-14-3"><span class="linenos" data-linenos=" 3 "></span></a>    mysql&gt; set global group_replication_bootstrap_group=ON;
<a id="__codelineno-14-4" name="__codelineno-14-4"></a><a href="#__codelineno-14-4"><span class="linenos" data-linenos=" 4 "></span></a>    Query OK, 0 rows affected (0.00 sec)
<a id="__codelineno-14-5" name="__codelineno-14-5"></a><a href="#__codelineno-14-5"><span class="linenos" data-linenos=" 5 "></span></a>
<a id="__codelineno-14-6" name="__codelineno-14-6"></a><a href="#__codelineno-14-6"><span class="linenos" data-linenos=" 6 "></span></a>    mysql&gt; CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-14-7" name="__codelineno-14-7"></a><a href="#__codelineno-14-7"><span class="linenos" data-linenos=" 7 "></span></a>    Query OK, 0 rows affected, 2 warnings (0.02 sec)
<a id="__codelineno-14-8" name="__codelineno-14-8"></a><a href="#__codelineno-14-8"><span class="linenos" data-linenos=" 8 "></span></a>
<a id="__codelineno-14-9" name="__codelineno-14-9"></a><a href="#__codelineno-14-9"><span class="linenos" data-linenos=" 9 "></span></a>    mysql&gt; START GROUP_REPLICATION;
<a id="__codelineno-14-10" name="__codelineno-14-10"></a><a href="#__codelineno-14-10"><span class="linenos" data-linenos="10 "></span></a>    Query OK, 0 rows affected (1.16 sec)
<a id="__codelineno-14-11" name="__codelineno-14-11"></a><a href="#__codelineno-14-11"><span class="linenos" data-linenos="11 "></span></a>
<a id="__codelineno-14-12" name="__codelineno-14-12"></a><a href="#__codelineno-14-12"><span class="linenos" data-linenos="12 "></span></a>    mysql&gt; set global group_replication_bootstrap_group=Off;
<a id="__codelineno-14-13" name="__codelineno-14-13"></a><a href="#__codelineno-14-13"><span class="linenos" data-linenos="13 "></span></a>    Query OK, 0 rows affected (0.00 sec)
<a id="__codelineno-14-14" name="__codelineno-14-14"></a><a href="#__codelineno-14-14"><span class="linenos" data-linenos="14 "></span></a>
<a id="__codelineno-14-15" name="__codelineno-14-15"></a><a href="#__codelineno-14-15"><span class="linenos" data-linenos="15 "></span></a>    #实例B
<a id="__codelineno-14-16" name="__codelineno-14-16"></a><a href="#__codelineno-14-16"><span class="linenos" data-linenos="16 "></span></a>    mysql&gt; CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-14-17" name="__codelineno-14-17"></a><a href="#__codelineno-14-17"><span class="linenos" data-linenos="17 "></span></a>    Query OK, 0 rows affected, 2 warnings (0.04 sec)
<a id="__codelineno-14-18" name="__codelineno-14-18"></a><a href="#__codelineno-14-18"><span class="linenos" data-linenos="18 "></span></a>
<a id="__codelineno-14-19" name="__codelineno-14-19"></a><a href="#__codelineno-14-19"><span class="linenos" data-linenos="19 "></span></a>    mysql&gt; start group_replication;
<a id="__codelineno-14-20" name="__codelineno-14-20"></a><a href="#__codelineno-14-20"><span class="linenos" data-linenos="20 "></span></a>    Query OK, 0 rows affected (4.31 sec)
<a id="__codelineno-14-21" name="__codelineno-14-21"></a><a href="#__codelineno-14-21"><span class="linenos" data-linenos="21 "></span></a>
<a id="__codelineno-14-22" name="__codelineno-14-22"></a><a href="#__codelineno-14-22"><span class="linenos" data-linenos="22 "></span></a>    #实例C
<a id="__codelineno-14-23" name="__codelineno-14-23"></a><a href="#__codelineno-14-23"><span class="linenos" data-linenos="23 "></span></a>    mysql&gt; CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-14-24" name="__codelineno-14-24"></a><a href="#__codelineno-14-24"><span class="linenos" data-linenos="24 "></span></a>    Query OK, 0 rows affected, 2 warnings (0.07 sec)
<a id="__codelineno-14-25" name="__codelineno-14-25"></a><a href="#__codelineno-14-25"><span class="linenos" data-linenos="25 "></span></a>
<a id="__codelineno-14-26" name="__codelineno-14-26"></a><a href="#__codelineno-14-26"><span class="linenos" data-linenos="26 "></span></a>    mysql&gt; start group_replication;
<a id="__codelineno-14-27" name="__codelineno-14-27"></a><a href="#__codelineno-14-27"><span class="linenos" data-linenos="27 "></span></a>    Query OK, 0 rows affected (3.83 sec)
</code></pre></div>

</div>

<h3 id="325-group_1"><strong>3.2.5 检查现在GROUP情况</strong><a class="headerlink" href="#325-group_1" title="Permanent link">&para;</a></h3>
<div>

目前GROUP中的各个成员都关闭了super_read_only选项，提供了读写服务，由于三个都为主库，属于多主情况，所以
global_status中无法查看到主库是哪个，因为这个GROUP中，每个SERVER都是MASTER。

</div>

<div>

 

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-15-1" name="__codelineno-15-1"></a><a href="#__codelineno-15-1"><span class="linenos" data-linenos=" 1 "></span></a>    mysql&gt; select * from performance_schema.replication_group_members;
<a id="__codelineno-15-2" name="__codelineno-15-2"></a><a href="#__codelineno-15-2"><span class="linenos" data-linenos=" 2 "></span></a>    +---------------------------+--------------------------------------+-------------+-------------+--------------+
<a id="__codelineno-15-3" name="__codelineno-15-3"></a><a href="#__codelineno-15-3"><span class="linenos" data-linenos=" 3 "></span></a>    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
<a id="__codelineno-15-4" name="__codelineno-15-4"></a><a href="#__codelineno-15-4"><span class="linenos" data-linenos=" 4 "></span></a>    +---------------------------+--------------------------------------+-------------+-------------+--------------+
<a id="__codelineno-15-5" name="__codelineno-15-5"></a><a href="#__codelineno-15-5"><span class="linenos" data-linenos=" 5 "></span></a>    | group_replication_applier | 2ec0fecd-16a2-11e7-97e1-52540005b8e1 | sutest244   |        3340 | ONLINE       |
<a id="__codelineno-15-6" name="__codelineno-15-6"></a><a href="#__codelineno-15-6"><span class="linenos" data-linenos=" 6 "></span></a>    | group_replication_applier | 94e39808-15ed-11e7-a7cf-52540005b8e2 | sutest242   |        3310 | ONLINE       |
<a id="__codelineno-15-7" name="__codelineno-15-7"></a><a href="#__codelineno-15-7"><span class="linenos" data-linenos=" 7 "></span></a>    | group_replication_applier | 9b78d231-15ed-11e7-a82a-52540005b8e2 | sutest242   |        3320 | ONLINE       |
<a id="__codelineno-15-8" name="__codelineno-15-8"></a><a href="#__codelineno-15-8"><span class="linenos" data-linenos=" 8 "></span></a>    +---------------------------+--------------------------------------+-------------+-------------+--------------+
<a id="__codelineno-15-9" name="__codelineno-15-9"></a><a href="#__codelineno-15-9"><span class="linenos" data-linenos=" 9 "></span></a>    3 rows in set (0.21 sec)
<a id="__codelineno-15-10" name="__codelineno-15-10"></a><a href="#__codelineno-15-10"><span class="linenos" data-linenos="10 "></span></a>
<a id="__codelineno-15-11" name="__codelineno-15-11"></a><a href="#__codelineno-15-11"><span class="linenos" data-linenos="11 "></span></a>    mysql&gt; select * from performance_schema.global_status where variable_name like &#39;%group%&#39;;
<a id="__codelineno-15-12" name="__codelineno-15-12"></a><a href="#__codelineno-15-12"><span class="linenos" data-linenos="12 "></span></a>    +----------------------------------+----------------+
<a id="__codelineno-15-13" name="__codelineno-15-13"></a><a href="#__codelineno-15-13"><span class="linenos" data-linenos="13 "></span></a>    | VARIABLE_NAME                    | VARIABLE_VALUE |
<a id="__codelineno-15-14" name="__codelineno-15-14"></a><a href="#__codelineno-15-14"><span class="linenos" data-linenos="14 "></span></a>    +----------------------------------+----------------+
<a id="__codelineno-15-15" name="__codelineno-15-15"></a><a href="#__codelineno-15-15"><span class="linenos" data-linenos="15 "></span></a>    | group_replication_primary_member |                |
<a id="__codelineno-15-16" name="__codelineno-15-16"></a><a href="#__codelineno-15-16"><span class="linenos" data-linenos="16 "></span></a>    +----------------------------------+----------------+
<a id="__codelineno-15-17" name="__codelineno-15-17"></a><a href="#__codelineno-15-17"><span class="linenos" data-linenos="17 "></span></a>    1 row in set (0.35 sec)
<a id="__codelineno-15-18" name="__codelineno-15-18"></a><a href="#__codelineno-15-18"><span class="linenos" data-linenos="18 "></span></a>
<a id="__codelineno-15-19" name="__codelineno-15-19"></a><a href="#__codelineno-15-19"><span class="linenos" data-linenos="19 "></span></a>    mysql&gt; show global variables like &#39;group_replication_single_primary_mode&#39;;
<a id="__codelineno-15-20" name="__codelineno-15-20"></a><a href="#__codelineno-15-20"><span class="linenos" data-linenos="20 "></span></a>    +---------------------------------------+-------+
<a id="__codelineno-15-21" name="__codelineno-15-21"></a><a href="#__codelineno-15-21"><span class="linenos" data-linenos="21 "></span></a>    | Variable_name                         | Value |
<a id="__codelineno-15-22" name="__codelineno-15-22"></a><a href="#__codelineno-15-22"><span class="linenos" data-linenos="22 "></span></a>    +---------------------------------------+-------+
<a id="__codelineno-15-23" name="__codelineno-15-23"></a><a href="#__codelineno-15-23"><span class="linenos" data-linenos="23 "></span></a>    | group_replication_single_primary_mode | OFF   |
<a id="__codelineno-15-24" name="__codelineno-15-24"></a><a href="#__codelineno-15-24"><span class="linenos" data-linenos="24 "></span></a>    +---------------------------------------+-------+
<a id="__codelineno-15-25" name="__codelineno-15-25"></a><a href="#__codelineno-15-25"><span class="linenos" data-linenos="25 "></span></a>    1 row in set (0.33 sec)
<a id="__codelineno-15-26" name="__codelineno-15-26"></a><a href="#__codelineno-15-26"><span class="linenos" data-linenos="26 "></span></a>
<a id="__codelineno-15-27" name="__codelineno-15-27"></a><a href="#__codelineno-15-27"><span class="linenos" data-linenos="27 "></span></a>    mysql&gt; show global variables like &#39;super%&#39;;
<a id="__codelineno-15-28" name="__codelineno-15-28"></a><a href="#__codelineno-15-28"><span class="linenos" data-linenos="28 "></span></a>    +-----------------+-------+
<a id="__codelineno-15-29" name="__codelineno-15-29"></a><a href="#__codelineno-15-29"><span class="linenos" data-linenos="29 "></span></a>    | Variable_name   | Value |
<a id="__codelineno-15-30" name="__codelineno-15-30"></a><a href="#__codelineno-15-30"><span class="linenos" data-linenos="30 "></span></a>    +-----------------+-------+
<a id="__codelineno-15-31" name="__codelineno-15-31"></a><a href="#__codelineno-15-31"><span class="linenos" data-linenos="31 "></span></a>    | super_read_only | OFF   |
<a id="__codelineno-15-32" name="__codelineno-15-32"></a><a href="#__codelineno-15-32"><span class="linenos" data-linenos="32 "></span></a>    +-----------------+-------+
<a id="__codelineno-15-33" name="__codelineno-15-33"></a><a href="#__codelineno-15-33"><span class="linenos" data-linenos="33 "></span></a>    1 row in set (1.20 sec)
</code></pre></div>

</div>

<div>

至此，多主模式已搭建结束，实例A、B、C均可提供读写。PS:
这里需要注意冲突处理机制，可以查看第五部分的故障模拟。

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222910863-2135554154.png)

</div>

<h1 id="4_1"><strong>4 管理维护</strong><a class="headerlink" href="#4_1" title="Permanent link">&para;</a></h1>
<div>

这部分内容主要涉及到几个系统表格，有点类似于 SQL
SERVER中的DMV视图，详见下表。

</div>

<div>

  ---- --------------------- ----------------------------------------------- ------------------ -----------------------------------------------------------------------------------------------------------------
  id   table_schema         table_name                                     type               description

  1    performance_schema   replication_group_members                     重要，常用         查看GROUP成员。

  2    performance_schema   replication_group_member_stats               重要，常用         当前SERVER在GROUP中的同步情况，查看applier通道的同步情况。

  3    performance_schema   replication_connection_stats                  重要，常用         当前server中各个通道的使用情况，applier通道是一定有显示，recovery通道看是否使用过，如果有则显示，没有则不显示。

  4    performance_schema   replication_applier_stats                     重要，常用         当前server中各个通道是否启用。

  5    performance_schema   global_status                                  重要，常用         单主模式下，可以查看当前主库是哪个。

  6    performance_schema   replication_applier_configuration             不常用，了解即可    

  7    performance_schema   replication_applier_status_by_coordinator   不常用，了解即可    

  8    performance_schema   replication_applier_status_by_worker        不常用，了解即可    

  9    performance_schema   replication_connection_configuration          不常用，了解即可    

  10   mysql                 slave_master_info                             重要，不常用       设置了master_info_repository=TABLE，所以master的相关信息会存储在这个表格。
                                                                                                如果使用GROUP中的SERVER备份数据库，恢复到时候，注意要清理这个表格。

  11   mysql                 slave_relay_log_info                         重要，不常用       设置了relay_log_info_repository=TABLE，所以master的相关信息会存储在这个表格。
                                                                                                如果使用GROUP中的SERVER备份数据库，恢复到时候，注意要清理这个表格。
  ---- --------------------- ----------------------------------------------- ------------------ -----------------------------------------------------------------------------------------------------------------

</div>

<div>

 

</div>

<h2 id="41-group_1"><strong>4.1 查看GROUP中的成员有哪些</strong><a class="headerlink" href="#41-group_1" title="Permanent link">&para;</a></h2>
<div>

SELECT * FROM performance_schema.replication_group_members

</div>

<h2 id="42_1"><strong>4.2 单主模式下主库是哪个</strong><a class="headerlink" href="#42_1" title="Permanent link">&para;</a></h2>
<div>

SELECT * FROM performance_schema.replication_group_members;

</div>

<div>

SELECT * FROM performance_schema. global_status;

</div>

<div>

两个查询出来的UUID一致的为 主库。

</div>

<div>

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406222944097-1229167323.png)

</div>

<h2 id="43_1"><strong>4.3 检查数据库是否正常提供读写服务</strong><a class="headerlink" href="#43_1" title="Permanent link">&para;</a></h2>
<div>

show global variables like 'super%';

</div>

<div>

SELECT * FROM performance_schema.replication_group_members;

</div>

<div>

 

</div>

<div>

如果super_read_only是启动的，那么该成员仅提供读服务；

</div>

<div>

如果super_read_only是关闭的，并且 replication_group_members
中正常的成员n 满足 2n+1 > 整个GROUP成员个数，并且该成员的 member
state是online，则该成员可提供读写服务。

</div>

<div>

 

</div>

<h2 id="44_1"><strong>4.4 检查数据库是否复制出现问题</strong><a class="headerlink" href="#44_1" title="Permanent link">&para;</a></h2>
<div>

可以通过表格replication_group_members
，replication_group_member_stats ，replication_connection_stats
，replication_applier_stats 查看

</div>

<div>

重点注意各个 组成员的 ERROR LOG详细信息，因为报错描述最清楚都在这里了。

</div>

<h1 id="5_1"><strong>5 故障模拟及处理</strong><a class="headerlink" href="#5_1" title="Permanent link">&para;</a></h1>
<p>节选测试过程的图，跟之前配置的GROUP有些不一致，理解注重思路即可，部分测试细节没有再次描述。</p>
<h2 id="51_1"><strong>5.1 单主模式</strong><a class="headerlink" href="#51_1" title="Permanent link">&para;</a></h2>
<h3 id="511-super_read_only_1"><strong>5.1.1 主库宕机，如何自动选择新主库？各个实例之间的super_read_only模式如何切换？</strong><a class="headerlink" href="#511-super_read_only_1" title="Permanent link">&para;</a></h3>
<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-16-1" name="__codelineno-16-1"></a><a href="#__codelineno-16-1"><span class="linenos" data-linenos="1 "></span></a>    select * from performance_schema.replication_group_members;
<a id="__codelineno-16-2" name="__codelineno-16-2"></a><a href="#__codelineno-16-2"><span class="linenos" data-linenos="2 "></span></a>    select * from performance_schema.global_status where VARIABLE_NAME=&#39;group_replication_primary_member&#39;;
<a id="__codelineno-16-3" name="__codelineno-16-3"></a><a href="#__codelineno-16-3"><span class="linenos" data-linenos="3 "></span></a>    show global variables like &#39;server_uuid&#39;;
<a id="__codelineno-16-4" name="__codelineno-16-4"></a><a href="#__codelineno-16-4"><span class="linenos" data-linenos="4 "></span></a>    show global variables like &#39;super%&#39;;
<a id="__codelineno-16-5" name="__codelineno-16-5"></a><a href="#__codelineno-16-5"><span class="linenos" data-linenos="5 "></span></a>
<a id="__codelineno-16-6" name="__codelineno-16-6"></a><a href="#__codelineno-16-6"><span class="linenos" data-linenos="6 "></span></a>    select * from performance_schema.replication_connection_status;
<a id="__codelineno-16-7" name="__codelineno-16-7"></a><a href="#__codelineno-16-7"><span class="linenos" data-linenos="7 "></span></a>    select * from performance_schema.replication_applier_status;
</code></pre></div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223456988-1912736444.png)

 

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223047847-1163554263.png)

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223104394-97088475.png)

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223108785-1780997342.png)

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223112488-462527634.png)

 [    模拟group中，有三个实例，端口分别为 3320,3330,3340，用简称来
m3320、m3330、m3340来分别描述。]{style="line-height: 1.5"}

</div>

<div>

    m3330在属于主库，模拟其主库宕机，使用 kill
进程方式，当m3330宕机后，m3320及m3340检查到 timeout
reading，则会从group_member中剔除该实例，同时检测宕机实例是否小于 floor((n-1)/2)
（n为group中所有实例个数），如果满足，则启动新的GROUP，按照GROUP中各个实例的UUID进行
升序排序，选择第一个作为新的主库，由于新主库之前是super_read_only状态，仅支持只读，升级为新主库后，会执行 ，不设置
super_read_only，关闭此参数，那么新主库则是可提供读写服务，原先的从库现在依旧为从库，super_read_only依旧为启动状态，仅提供读服务。

</div>

<h3 id="512-group_1"><strong>5.1.2 主库宕机后，恢复，重新加入group</strong><a class="headerlink" href="#512-group_1" title="Permanent link">&para;</a></h3>
<div>

   
旧主库恢复后，检查GROUP_REPLICATION相关参数，是否设置有误，它需要以一个从库的方式加入，详见
GROUP配置的参数说明。

</div>

<div>

如果参数无误，执行change master，然后start 即可。

</div>

<div>

 

<div class="highlight"><pre><span></span><code><a id="__codelineno-17-1" name="__codelineno-17-1"></a><a href="#__codelineno-17-1"><span class="linenos" data-linenos="1 "></span></a>    CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-17-2" name="__codelineno-17-2"></a><a href="#__codelineno-17-2"><span class="linenos" data-linenos="2 "></span></a>    START GROUP_REPLICATION;
</code></pre></div>

</div>

<div>

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223534988-449884227.png)

</div>

<div>

    其他两个节点检查连接情况，连接无误后，加入group中，更新 GROUP
Member，同时开始同步差异binlog日志内容。

</div>

<h3 id="513-1_1"><strong>5.1.3 从库宕机1台，影响情况</strong><a class="headerlink" href="#513-1_1" title="Permanent link">&para;</a></h3>
<div>

    kill 3330进程，模拟从库宕机，发现剩下实例检测到 m3330异常，从
group中删除，主库m3320照常提供读写服务，从库m3340照常提供读服务。

</div>

<div>

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223551347-278872071.png)

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223600394-14447633.png)

</div>

<h3 id="514-2_1"><strong>5.1.4 从库宕机2台，影响情况</strong><a class="headerlink" href="#514-2_1" title="Permanent link">&para;</a></h3>
<div>

    基于3的基础上，再次kill 3340进程，模拟从库宕机，主库3320检查到
m3340异常，但是没有删除该 成员，而是便是为
unreachable，表明该成员可能由于崩溃或者意外被断开而导致的不可访问。

</div>

<div>

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223621628-2038020391.png)

</div>

<div>

    或者（两个从库宕机的时刻非常接近，则来不及判断剔除出group）

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223632113-1134751331.png)

</div>

<div>

    对仅存活动 m3320 执行查询操作，是正常情况。但是DDL及DML
操作，均处于等待状态，并且，error log也无报错情况。

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223652191-1606612293.png)

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223656597-1187916639.png)

</div>

<div>

**   
[这个时候，如果想要恢复主库读写服务，需停止group（这里有个疑问，查看replication_applier_status，主库状态正常；但是不提供读写应该从哪个地方判断呢，难道是group_member的正常个数不满足group的正常个数要求，则不提供服务？除了stop
group_relication和新加入节点外，还有其他方式处理吗？]{style="color: rgba(255, 0, 0, 1)"}**[**）**]{style="color: rgba(255, 0, 0, 1)"}

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223721535-16323259.png)

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223726472-104636286.png)

![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223731644-273037608.png)

</div>

<h3 id="515-innobackupex_1"><strong>5.1.5</strong> <strong>新增从库：innobackupex新增（这个需要留意）</strong><a class="headerlink" href="#515-innobackupex_1" title="Permanent link">&para;</a></h3>
<div>

    选择在 m3320备份实例，备份结束后apply log。

</div>

<div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-18-1" name="__codelineno-18-1"></a><a href="#__codelineno-18-1"><span class="linenos" data-linenos="1 "></span></a>    1 innobackupex --datadir=/data/mysql/mysql3320/data/ --user=root --password=ycf.com --no-timestamp --socket=/tmp/mysql3320.sock /data/backup3320
<a id="__codelineno-18-2" name="__codelineno-18-2"></a><a href="#__codelineno-18-2"><span class="linenos" data-linenos="2 "></span></a>    2 innobackupex --apply-log /data/backup3320
</code></pre></div>

</div>

</div>

<div>

    第一次启动数据库时，报错，找不到relay log文件，因为拷贝过来的时候
，备份库指定参数如下，mysql库中的master_relay_log_info指定了relay
log的相关信息，但是现在没有找到文件，数据库会自动创建
applier跟recovery系列文件。

</div>

<div>

master_info_repository=TABLE

</div>

<div>

relay_log_info_repository=TABLE

</div>

<div>

 

</div>

<div>

    所以需要进入数据库中，**truncate
两个表格：mysql.slave_master_info, mysql.slave_relay_log_info
，然后删除 applier跟recovery系列文件 。**

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-19-1" name="__codelineno-19-1"></a><a href="#__codelineno-19-1"><span class="linenos" data-linenos="1 "></span></a>    1 truncate table mysql.slave_master_info
<a id="__codelineno-19-2" name="__codelineno-19-2"></a><a href="#__codelineno-19-2"><span class="linenos" data-linenos="2 "></span></a>    2 truncate table mysql.slave_relay_log_info
<a id="__codelineno-19-3" name="__codelineno-19-3"></a><a href="#__codelineno-19-3"><span class="linenos" data-linenos="3 "></span></a>    3  
<a id="__codelineno-19-4" name="__codelineno-19-4"></a><a href="#__codelineno-19-4"><span class="linenos" data-linenos="4 "></span></a>    4 rm -rf applier系列文件
<a id="__codelineno-19-5" name="__codelineno-19-5"></a><a href="#__codelineno-19-5"><span class="linenos" data-linenos="5 "></span></a>    5 rm -rf recovery系列文件
</code></pre></div>

</div>

<div>

查看下备份的GTID集合，如下

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223753832-1813782132.png)

</div>

<div>

重启数据库服务，进入数据库，重新配置GTID集合与备份中的一致，启动GROUP_REPLICATION。

</div>

<div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-20-1" name="__codelineno-20-1"></a><a href="#__codelineno-20-1"><span class="linenos" data-linenos="1 "></span></a>    RESET MASTER;
<a id="__codelineno-20-2" name="__codelineno-20-2"></a><a href="#__codelineno-20-2"><span class="linenos" data-linenos="2 "></span></a>    SET @@GLOBAL.GTID_PURGED=&#39;9ac06b4e-13aa-11e7-a62e-5254004347f9:1-10&#39;;
<a id="__codelineno-20-3" name="__codelineno-20-3"></a><a href="#__codelineno-20-3"><span class="linenos" data-linenos="3 "></span></a>
<a id="__codelineno-20-4" name="__codelineno-20-4"></a><a href="#__codelineno-20-4"><span class="linenos" data-linenos="4 "></span></a>    CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-20-5" name="__codelineno-20-5"></a><a href="#__codelineno-20-5"><span class="linenos" data-linenos="5 "></span></a>    START GROUP_REPLICATION;
</code></pre></div>

</div>

</div>

<h3 id="516-mysqldump_1"><strong>5.1.6</strong> <strong>新增从库：mysqldump新增（这个需要留意）</strong><a class="headerlink" href="#516-mysqldump_1" title="Permanent link">&para;</a></h3>
<div>

备份数据库实例：

</div>

<div>

/usr/local/mysql5717/bin/mysqldump --socket=/tmp/mysql3320.sock -uroot
-p --all-databases > ~/mysql3320.sql

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223806707-1068435636.png)

</div>

<div>

[**    这里有个小TIPS，个人建议，建立一个新的实例后，在新实例中安装
好 group_replication
引擎，不要等到source后再安装，这样的好处是：避免直接在恢复的数据库实例上安装引擎，会出现各种错误。**]{style="color: rgba(255, 0, 0, 1)"}

</div>

<div>

 

</div>

<div>

    在服务器上先安装
group_replication引擎，然后再source数据，避免source数据后由于环境问题导致group_replication引擎安装有问题

</div>

<div>

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

</div>

<div>

 

</div>

<div>

    成功后source /data/mysql3320.sql

</div>

<div>

    检查当前的binlog跟gtid使用情况，show master status;

</div>

<div>

    由于目前的使用情况跟mysqldump中的
gtid_purge不一致，重新拷贝下mysql3320.sql中的
gtid_purged语句，注意，如果当前的gtid_excuted不为空，则需要重置下master相关信息，reset
master后执行gtid_purge语句。

</div>

<div>

 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223826832-1768315079.png)

</div>

<div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-21-1" name="__codelineno-21-1"></a><a href="#__codelineno-21-1"><span class="linenos" data-linenos="1 "></span></a>    SET @@GLOBAL.GTID_PURGED=&#39;9ac06b4e-13aa-11e7-a62e-5254004347f9:1-18&#39;; #看GTID集合是否一致
<a id="__codelineno-21-2" name="__codelineno-21-2"></a><a href="#__codelineno-21-2"><span class="linenos" data-linenos="2 "></span></a>    CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-21-3" name="__codelineno-21-3"></a><a href="#__codelineno-21-3"><span class="linenos" data-linenos="3 "></span></a>    START GROUP_REPLICATION;
</code></pre></div>

</div>

</div>

<h2 id="52_1"><strong>5.2 多主模式</strong><a class="headerlink" href="#52_1" title="Permanent link">&para;</a></h2>
<h3 id="521_1"><strong>5.2.1 单主模式切换多主模式</strong><a class="headerlink" href="#521_1" title="Permanent link">&para;</a></h3>
<div>

这部分参考第三部分的第二节，多主模式。

</div>

<div>

简要步骤：

</div>

<div>

1 先由 从主库开始，逐一逐一停止group replication

</div>

<div>

2 设置group_replication_single_primary_mode 关闭

</div>

<div>

3 依次启动GROUP replication

</div>

<div>

 

</div>

<div>

测试内容：

</div>

<div>

1 整个GROUP中每个SERVER同时执行一个DML语句

</div>

<div>

2 整个GROUP中每个SERVER同时执行一个DDL语句

</div>

<div>

 

</div>

<div>

测试结论：

</div>

<div>

**[   
严重注意，如果在同时提交DDL语句，则在每个实例都是可以提交成功，但是同步到各个实例的时候会发生报错，group_replication出现
error错误，所有实例启动super_read_only只读情况，整个group不提供
写操作，需要人为接入修复。所以DDL语句，建议在设计的时候，就专门只有一个实例可以执行DDL语句，人为默认在某一台上执行DDL语句，而不是每台都执行，避免不必要的冲突。]{style="color: rgba(255, 0, 0, 1)"}**

</div>

<h3 id="522_1"><strong>5.2.2 宕机一台整体影响</strong><a class="headerlink" href="#522_1" title="Permanent link">&para;</a></h3>
<div>

kill
进程，其他实例检车链接有问题后，剔除该节点，正常操作。 ![](https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223837988-1000011999.png)

</div>

<h3 id="523_1"><strong>5.2.3 宕机后重新加入</strong><a class="headerlink" href="#523_1" title="Permanent link">&para;</a></h3>
<div>

启动数据库实例后，记得检查
group_replication_single_primary_mode是否是关闭状态，如果不是，注意启动，要不然会由于模式不一致报错，

</div>

<div>

set global group_replication_single_primary_mode=OFF;

</div>

<div>

 

</div>

<div>

正常执行 

</div>

<div>

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='replforslave' FOR CHANNEL 'group_replication_recovery';

</div>

<div>

START GROUP_REPLICATION;

</div>

<h3 id="524_1"><strong>5.2.4 宕机超过合理个数，整体影响（非一个个慢慢宕机，而是一口气宕机超过合理个数）</strong><a class="headerlink" href="#524_1" title="Permanent link">&para;</a></h3>
<div>

   
5台server端，一口气停机了3台，则3台的status修改为UNREACHABLE，剩下的2台为ONLINE，虽然super_read_only是关闭的状态，但是这两台server不提供写功能，仅提供读功能。

</div>

<div>

   
这里注意下，如果这个时候，发生DML操作，则会挂起该操作，一直处于等待状态，其他链接可以正常连接数据库进行操作；但是如果发生DDL操作，这个时候，不仅该会话处于等待状态，而且其他新的连接将无法执行user
dbname(涉及操作的DBname）进入到该数据库中进行
任何查询操作，但是可以在其他数据库上 使用 dbname.tbname
方式查询，比如select * from dbgroup.alld！

</div>

<div>

 

</div>

<div>

    仅剩下的一台主库居然不提供读写，除非关闭stop group_replication！

</div>

<div>

 

</div>

<div>

    关闭后，error log中会提示事务回滚信息。

</div>

<div>

 

</div>

<h3 id="525-dbinnobackupex_1"><strong>5.2.5 新增DB：innobackupex新增</strong><a class="headerlink" href="#525-dbinnobackupex_1" title="Permanent link">&para;</a></h3>
<div>

简要步骤

</div>

<ol>
<li>备份后执行apply log</li>
<li>新建实例，添加plugins引擎</li>
<li>替换数据目录</li>
<li>启动数据库</li>
<li>清理relay-log文件，清理slave_master_info跟slave_relay_log_info信息</li>
<li>查看当前的GTID序号是否与
    xtrabackup_binlog_info记录一致，如果不一致，执行 set gtid_purged</li>
<li>重启数据库服务</li>
<li>检查group replication配置是否有误</li>
<li>change master</li>
<li>start group_replication</li>
</ol>
<div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-22-1" name="__codelineno-22-1"></a><a href="#__codelineno-22-1"><span class="linenos" data-linenos="1 "></span></a>    #部分参考SQL
<a id="__codelineno-22-2" name="__codelineno-22-2"></a><a href="#__codelineno-22-2"><span class="linenos" data-linenos="2 "></span></a>    SET @@GLOBAL.GTID_PURGED=&#39;9ac06b4e-13aa-11e7-a62e-5254004347f9:1-26:1000004&#39;;
<a id="__codelineno-22-3" name="__codelineno-22-3"></a><a href="#__codelineno-22-3"><span class="linenos" data-linenos="3 "></span></a>    CHANGE MASTER TO MASTER_USER=&#39;repl&#39;, MASTER_PASSWORD=&#39;replforslave&#39; FOR CHANNEL &#39;group_replication_recovery&#39;;
<a id="__codelineno-22-4" name="__codelineno-22-4"></a><a href="#__codelineno-22-4"><span class="linenos" data-linenos="4 "></span></a>    START GROUP_REPLICATION;
</code></pre></div>

</div>

</div>

<h3 id="526-dbmysqldump_1"><strong>5.2.6 新增DB：mysqldump新增</strong><a class="headerlink" href="#526-dbmysqldump_1" title="Permanent link">&para;</a></h3>
<div>

简要步骤

</div>

<ol>
<li>新建实例，添加plugins引擎</li>
<li>source 备份文件</li>
<li>清理relay-log文件，清理slave_master_info跟slave_relay_log_info信息</li>
<li>查看当前的GTID序号是否与备份文件前面记录一致，如果不一致，执行 set
    gtid_purged</li>
<li>检查group replication配置是否有误</li>
<li>change master</li>
<li>start group_replication</li>
</ol>
<div>

**6 问题记录**
==============

</div>

<p><strong>1</strong> ip间隔是 逗号</p>
<p><strong>2</strong> 不要有分号，本人就这么笨的开始！</p>
<p><strong>3</strong> port是使用端口号 ，非实例端口号</p>
<p><strong>4</strong> [ERROR] Plugin group_replication reported: 'This member has
more executed transactions than those present in the group. Local
transactions: 32538cbf-12fc-11e7-af43-5254004347f9:1-5 &gt; Group
transactions: 2236bd6b-12fc-11e7-a706-5254004347f9:1-16</p>
<p><img alt="" src="https://images2015.cnblogs.com/blog/608061/201704/608061-20170406223903832-183102352.png" /></p>
<div>

 [ERROR] Plugin group_replication reported: 'This member has more
executed transactions than those present in the group. Local
transactions: 32538cbf-12fc-11e7-af43-5254004347f9:1-5 > Group
transactions:
2236bd6b-12fc-11e7-a706-5254004347f9:1-16,9ac06b4e-13aa-11e7-a62e-5254004347f9:1'

</div>

<p>[ERROR] Plugin group_replication reported: 'The member contains
transactions not present in the group. The member will now exit the
group.'</p>
<p>[Note] Plugin group_replication reported: 'To force this member into
the group you can use the
group_replication_allow_local_disjoint_gtids_join option'</p>
<ul>
<li>解决<ul>
<li>set global
    group_replication_allow_local_disjoint_gtids_join=ON;（但是实际上这种方法治标不治本）</li>
<li>建议还是在搭建group_replication的时候，在start
    group_replication之前，reset master，重置所有binary
    log，这样就不会出现各个实例之间的日志超前影响；但是这里要考虑是否影响到旧主从。</li>
</ul>
</li>
</ul>
<p><strong>5</strong> [ERROR] Plugin group_replication reported: 'Table te does not
have any PRIMARY KEY. This is not compatible with Group Replication'</p>
<p>表格需要添加主键</p>
<p><strong>6</strong> mysql&gt; insert into ct(id,name) select 2,'b'; ERROR 1290
(HY000): The MySQL server is running with the --super-read-only option
so it cannot execute this statement </p>
<p>只读模式下，不提供写服务。</p>
<p><strong>7</strong> [ERROR] Plugin group_replication reported: 'Transaction cannot
be executed while Group Replication is on ERROR state. Check for errors
and restart the plugin'   2017-03-29T15:46:13.619141Z 31 [ERROR] Run
function 'before_commit' in plugin 'group_replication' failed </p>
<p>GROUP出错了，是否是重复执行冲突了，好好处理下</p>
<h1 id="7_1"><strong>7  未解决问题</strong><a class="headerlink" href="#7_1" title="Permanent link">&para;</a></h1>
<div>

1 可以通过 show slaves status for channel
'group_replication_recovery' 查看recovery通道执行情况，但是怎么看
applier呢？（show slaves status for channel
'group_replication_applier'报错 ）

</div>

<div>

2
当宕机超过有效个数时，查看replication_applier_status，状态正常，但是ONLINE的server实际上不提供写服务，仅提供读服务，可以通过什么方式快速判断呢？个人认为是以下判断，是否有更好的方式？

</div>

<div>

 

</div>

<div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-23-1" name="__codelineno-23-1"></a><a href="#__codelineno-23-1"><span class="linenos" data-linenos="1 "></span></a>show global variables like &#39;super%&#39;;
</code></pre></div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-24-1" name="__codelineno-24-1"></a><a href="#__codelineno-24-1"><span class="linenos" data-linenos="1 "></span></a>SELECT * FROM performance_schema.replication_group_members;
</code></pre></div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-25-1" name="__codelineno-25-1"></a><a href="#__codelineno-25-1"><span class="linenos" data-linenos="1 "></span></a>如果super_read_only是启动的，那么该成员仅提供读服务；
</code></pre></div>

<div class="highlight"><pre><span></span><code><a id="__codelineno-26-1" name="__codelineno-26-1"></a><a href="#__codelineno-26-1"><span class="linenos" data-linenos="1 "></span></a>如果super_read_only是关闭的，并且 replication_group_members
<a id="__codelineno-26-2" name="__codelineno-26-2"></a><a href="#__codelineno-26-2"><span class="linenos" data-linenos="2 "></span></a>中正常的成员n 满足 2n+1 &gt; 整个GROUP成员个数，并且该成员的 member
<a id="__codelineno-26-3" name="__codelineno-26-3"></a><a href="#__codelineno-26-3"><span class="linenos" data-linenos="3 "></span></a>state是online，则该成员可提供读写服务。
</code></pre></div>

</div>

<div>

 

</div>

<div>

3
当宕机超过有效个数时，ONLINE的server仅提供读服务，如果需要启动写服务，目前个人测试结果是只有两种方案恢复写服务：当前SERVER，执行stop
group_replication；恢复另外的异常SERVER变正常。是否还有其他方式？

</div>

<div>

 

</div>

<div>

<div>

4 GROUP中剔除一个成员，假设N个节点，一个节点故障，是采用多数投票机制还是全部一致投票机制？

</div>

</div>

<div>

 

</div>

<div>

参考文档：

</div>

<div>

mysql官方在20161212正式发布了group
replication版本，官网详细地址：<https://dev.mysql.com/doc/refman/5.7/en/group-replication.html>

</div>

<div>

感谢京东的中文翻译：<http://acmug.net/?p=164> ，某些地方字面直译，有些不好理解，如果感觉理解有误，可对照看下英文文档。
翻译中文文档下载地址：<http://storage.360buyimg.com/brickhaha/Mysql.pdf>

</div>

<div>
</div>

              
            </article>
          </div>
        </div>
        
      </main>
      
        <footer class="md-footer">
  
  <div class="md-footer-meta md-typeset">
    <div class="md-footer-meta__inner md-grid">
      <div class="md-copyright">
  
  
    Made with
    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
      Material for MkDocs
    </a>
  
</div>
      
    </div>
  </div>
</footer>
      
    </div>
    <div class="md-dialog" data-md-component="dialog">
      <div class="md-dialog__inner md-typeset"></div>
    </div>
    <script id="__config" type="application/json">{"base": "../../../..", "features": ["search.suggest", "search.highlight", "navigation.tabs", "navigation.expand", "toc.follow", "toc.integrate"], "search": "../../../../assets/javascripts/workers/search.5e67fbfe.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}, "version": {"default": "latest", "provider": "mike"}}</script>
    
    
      <script src="../../../../assets/javascripts/bundle.c44cc438.min.js"></script>
      
        <script src="../../../../static/js/util.js"></script>
      
    
  </body>
</html>